67L1 发表于 2022-8-21 16:09:24

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

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= a;
                              re= b;
                              re= d;
                              re= d+2;
                              re= 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;
      }
}

sj185123 发表于 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;
        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= a;
                                        re= b;
                                        re= d;
                                        re= d+2;
                                        re= 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,re,re,re,re);
       
                      putchar('\n');
                      }
                      putchar('\n');
                }
       
       
       
                return 0;

}

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

67L1 发表于 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,re,re,re,re);

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



      return 0;

67L1 发表于 2022-8-21 16:14:09

67L1 发表于 2022-8-21 16:10


这是后面的代码,后面的数组打印出来全是乱码

额外减小 发表于 2022-8-22 00:34:16

你可不可以发完整的代码?谢谢

sj185123 发表于 2022-8-22 15:39:56

你这代码还是不全啊,能不能从头到尾一次发出来?要不不好判断。谢谢。而且这么多行问题不是能一眼看出来的,要调试的,没有全部代码,也没法调试啊。

67L1 发表于 2022-8-23 18:38:17

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

谢了我的哥,不过为啥i++在前面第一行赋不了值呀?我给i的初始值就是0呀

67L1 发表于 2022-8-23 19:07:23

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

为什么a++的位置也会有影响呢?在前在后的区别在哪里

67L1 发表于 2022-8-23 19:11:07

67L1 发表于 2022-8-23 19:07
为什么a++的位置也会有影响呢?在前在后的区别在哪里

a++的return值不应该是++之前的值吗——就是a=3,a++后,第一次循环时,a不是以3的身份进行循环吗

sj185123 发表于 2022-8-24 08:12:51

67L1 发表于 2022-8-23 18:38
谢了我的哥,不过为啥i++在前面第一行赋不了值呀?我给i的初始值就是0呀

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

sj185123 发表于 2022-8-24 08:14:29

sj185123 发表于 2022-8-24 08:12
数组是从0开始算的,假如你定义i,那么4个变量就是i,i,i,i,定义i,就是从0~8,开头就是 ...

注意,这里改成for循环后,循环体中的a++要删掉

67L1 发表于 2022-8-26 22:15:13

sj185123 发表于 2022-8-24 08:14
注意,这里改成for循环后,循环体中的a++要删掉

谢谢哥
页: [1]
查看完整版本: S1E21第二题,为什么count=7之后,检验出来结论失败,而且数组后面打印出来也是乱的