鱼C论坛

 找回密码
 立即注册
查看: 3188|回复: 11

[已解决]S1E21第二题,为什么count=7之后,检验出来结论失败,而且数组后面打印出来也是乱的

[复制链接]
发表于 2022-8-21 16:09:24 | 显示全部楼层 |阅读模式
8鱼币
a=3;
while(a<=count)
{
        a++;
        b=a*a*a;//立方数
        d=1;  //首项
        p=1;  //项数
        while(1)
        {
                p++;  //首项为1时,不断增加项数
                c=(d+(d+(p-1)*2))*p/2;//利用(首项+末项)*项数/2
                if(c==b)  //试数正确时,则保存数据
                {
                        e=d+(p-1)*2;//末项
                                i++;
                                re[i][0]= a;
                                re[i][1]= b;
                                re[i][2]= d;
                                re[i][3]= d+2;
                                re[i][4]= e;

                                c=0;
                        break;//跳出内循环,换立方根
                }
                if(c>b)  //试数错误,则重置数据,改变首项,继续试数
                {
                        d+=2;
                        c=0;
                        p=1;
                }
                if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
                {
                        test=0;
                        break;
                }

        }
        if(d>b/2)
        {
                break;
        }
}
最佳答案
2022-8-21 16:09:25
a++和i++位置不对要放到后头,输出乱码应该是因为i++在前头所以第一行未赋值,至于结论错误,我没看到你全部代码,test你给赋初值为1了吗?
由于我没有你全部代码,我在你发出的代码基础上自行补全和修改了一下,能正确输出结果,你看一下:
#include <stdio.h>

int main()
{
        int count,a,b,c,d,e,p;
        char k;
        int i=0,test=1;
        int re[100][5];
        printf("输入:"); 
        scanf("%d",&count);
                a=3;
        while(a<=count)
        {
                b=a*a*a;//立方数
                d=1;  //首项
                p=1;  //项数
                while(1)
                {
                        p++;  //首项为1时,不断增加项数
                        c=(d+(d+(p-1)*2))*p/2;//利用(首项+末项)*项数/2
                        if(c==b)  //试数正确时,则保存数据
                        {
                                e=d+(p-1)*2;//末项
                                        re[i][0]= a;
                                        re[i][1]= b;
                                        re[i][2]= d;
                                        re[i][3]= d+2;
                                        re[i][4]= e;
                                                                    i++;
                                        c=0;
                                break;//跳出内循环,换立方根
                        }
                        if(c>b)  //试数错误,则重置数据,改变首项,继续试数
                        {
                                d+=2;
                                c=0;
                                p=1;
                        }
                        if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
                        {
                                test=0;
                                break;
                        }
        
                }
                if(d>b/2)
                {
                        break;
                }
                a++;
        }
        
        if(test==1)
        {
                printf("结论正确!\n");
        }
        else
        {
                printf("结论错误!\n");
        }
        getchar();
        
                printf("是否打印(y/n):");
                scanf("%c",&k);
        
                if(k=='y')
        
                {
        
        
                        for(i=0;i<count-2;i++)
                        {
        
                printf("%d^3 = %d = %d + %d + ... + %d",re[i][0],re[i][1],re[i][2],re[i][3],re[i][4]);
        
                        putchar('\n');
                        }
                        putchar('\n');
                }
        
        
        
                return 0;

}
格式由于直接复制你的代码,没认真调,你将就看一下,输出结果是正确的
210629f2ihqqqqrhfj6q46.png

最佳答案

查看完整内容

a++和i++位置不对要放到后头,输出乱码应该是因为i++在前头所以第一行未赋值,至于结论错误,我没看到你全部代码,test你给赋初值为1了吗? 由于我没有你全部代码,我在你发出的代码基础上自行补全和修改了一下,能正确输出结果,你看一下: 格式由于直接复制你的代码,没认真调,你将就看一下,输出结果是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-21 16:09:25 | 显示全部楼层    本楼为最佳答案   
a++和i++位置不对要放到后头,输出乱码应该是因为i++在前头所以第一行未赋值,至于结论错误,我没看到你全部代码,test你给赋初值为1了吗?
由于我没有你全部代码,我在你发出的代码基础上自行补全和修改了一下,能正确输出结果,你看一下:
#include <stdio.h>

int main()
{
        int count,a,b,c,d,e,p;
        char k;
        int i=0,test=1;
        int re[100][5];
        printf("输入:"); 
        scanf("%d",&count);
                a=3;
        while(a<=count)
        {
                b=a*a*a;//立方数
                d=1;  //首项
                p=1;  //项数
                while(1)
                {
                        p++;  //首项为1时,不断增加项数
                        c=(d+(d+(p-1)*2))*p/2;//利用(首项+末项)*项数/2
                        if(c==b)  //试数正确时,则保存数据
                        {
                                e=d+(p-1)*2;//末项
                                        re[i][0]= a;
                                        re[i][1]= b;
                                        re[i][2]= d;
                                        re[i][3]= d+2;
                                        re[i][4]= e;
                                                                    i++;
                                        c=0;
                                break;//跳出内循环,换立方根
                        }
                        if(c>b)  //试数错误,则重置数据,改变首项,继续试数
                        {
                                d+=2;
                                c=0;
                                p=1;
                        }
                        if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
                        {
                                test=0;
                                break;
                        }
        
                }
                if(d>b/2)
                {
                        break;
                }
                a++;
        }
        
        if(test==1)
        {
                printf("结论正确!\n");
        }
        else
        {
                printf("结论错误!\n");
        }
        getchar();
        
                printf("是否打印(y/n):");
                scanf("%c",&k);
        
                if(k=='y')
        
                {
        
        
                        for(i=0;i<count-2;i++)
                        {
        
                printf("%d^3 = %d = %d + %d + ... + %d",re[i][0],re[i][1],re[i][2],re[i][3],re[i][4]);
        
                        putchar('\n');
                        }
                        putchar('\n');
                }
        
        
        
                return 0;

}
格式由于直接复制你的代码,没认真调,你将就看一下,输出结果是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-21 16:10:17 | 显示全部楼层
if(test==1)
{
        printf("结论正确!\n");
}
else
{
        printf("结论错误!\n");
}
getchar();

        printf("是否打印(y/n):");
        scanf("%c",&k);

        if(k=='y')

        {


                for(i=0;i<count-2;i++)
                {

        printf("%d^3 = %d = %d + %d + %d",re[i][0],re[i][1],re[i][2],re[i][3],re[i][4]);

                putchar('\n');
                }
                putchar('\n');
        }



        return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-21 16:14:09 | 显示全部楼层

这是后面的代码,后面的数组打印出来全是乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-22 00:34:16 | 显示全部楼层
你可不可以发完整的代码?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-22 15:39:56 | 显示全部楼层
你这代码还是不全啊,能不能从头到尾一次发出来?要不不好判断。谢谢。而且这么多行问题不是能一眼看出来的,要调试的,没有全部代码,也没法调试啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-23 18:38:17 | 显示全部楼层
sj185123 发表于 2022-8-21 16:09
a++和i++位置不对要放到后头,输出乱码应该是因为i++在前头所以第一行未赋值,至于结论错误,我没看到你全 ...

谢了我的哥,不过为啥i++在前面第一行赋不了值呀?我给i的初始值就是0呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-23 19:07:23 | 显示全部楼层
sj185123 发表于 2022-8-21 16:09
a++和i++位置不对要放到后头,输出乱码应该是因为i++在前头所以第一行未赋值,至于结论错误,我没看到你全 ...

为什么a++的位置也会有影响呢?在前在后的区别在哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-23 19:11:07 | 显示全部楼层
67L1 发表于 2022-8-23 19:07
为什么a++的位置也会有影响呢?在前在后的区别在哪里

a++的return值不应该是++之前的值吗——就是a=3,a++后,第一次循环时,a不是以3的身份进行循环吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-24 08:12:51 | 显示全部楼层
67L1 发表于 2022-8-23 18:38
谢了我的哥,不过为啥i++在前面第一行赋不了值呀?我给i的初始值就是0呀

数组是从0开始算的,假如你定义i[4],那么4个变量就是i[0],i[1],i[2],i[3],定义i[9],就是从0~8,开头就是i++,那么i=1了,所以你把i[0][]的几个元素跳过去了,同理a你给3,在进行运算之前就a++,那么你就直接判断了4,那么你给count值的时候,你判断的就是4~count+1,与题意不符。一般i++这种都是放在后面的。其实你也可以用for循环,就不用了纠结放在哪里,直接把
        while(a<=count)
改成
for(a;a<=count;a++)
就好了。这种情况正常用for循环是很合适的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-24 08:14:29 | 显示全部楼层
sj185123 发表于 2022-8-24 08:12
数组是从0开始算的,假如你定义i[4],那么4个变量就是i[0],i[1],i[2],i[3],定义i[9],就是从0~8,开头就是 ...

注意,这里改成for循环后,循环体中的a++要删掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-26 22:15:13 | 显示全部楼层
sj185123 发表于 2022-8-24 08:14
注意,这里改成for循环后,循环体中的a++要删掉

谢谢哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 03:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表