鱼C论坛

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

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

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

  21.                                 c=0;
  22.                         break;//跳出内循环,换立方根
  23.                 }
  24.                 if(c>b)  //试数错误,则重置数据,改变首项,继续试数
  25.                 {
  26.                         d+=2;
  27.                         c=0;
  28.                         p=1;
  29.                 }
  30.                 if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
  31.                 {
  32.                         test=0;
  33.                         break;
  34.                 }

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

  2. int main()
  3. {
  4.         int count,a,b,c,d,e,p;
  5.         char k;
  6.         int i=0,test=1;
  7.         int re[100][5];
  8.         printf("输入:");
  9.         scanf("%d",&count);
  10.                 a=3;
  11.         while(a<=count)
  12.         {
  13.                 b=a*a*a;//立方数
  14.                 d=1;  //首项
  15.                 p=1;  //项数
  16.                 while(1)
  17.                 {
  18.                         p++;  //首项为1时,不断增加项数
  19.                         c=(d+(d+(p-1)*2))*p/2;//利用(首项+末项)*项数/2
  20.                         if(c==b)  //试数正确时,则保存数据
  21.                         {
  22.                                 e=d+(p-1)*2;//末项
  23.                                         re[i][0]= a;
  24.                                         re[i][1]= b;
  25.                                         re[i][2]= d;
  26.                                         re[i][3]= d+2;
  27.                                         re[i][4]= e;
  28.                                                                     i++;
  29.                                         c=0;
  30.                                 break;//跳出内循环,换立方根
  31.                         }
  32.                         if(c>b)  //试数错误,则重置数据,改变首项,继续试数
  33.                         {
  34.                                 d+=2;
  35.                                 c=0;
  36.                                 p=1;
  37.                         }
  38.                         if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
  39.                         {
  40.                                 test=0;
  41.                                 break;
  42.                         }
  43.        
  44.                 }
  45.                 if(d>b/2)
  46.                 {
  47.                         break;
  48.                 }
  49.                 a++;
  50.         }
  51.        
  52.         if(test==1)
  53.         {
  54.                 printf("结论正确!\n");
  55.         }
  56.         else
  57.         {
  58.                 printf("结论错误!\n");
  59.         }
  60.         getchar();
  61.        
  62.                 printf("是否打印(y/n):");
  63.                 scanf("%c",&k);
  64.        
  65.                 if(k=='y')
  66.        
  67.                 {
  68.        
  69.        
  70.                         for(i=0;i<count-2;i++)
  71.                         {
  72.        
  73.                 printf("%d^3 = %d = %d + %d + ... + %d",re[i][0],re[i][1],re[i][2],re[i][3],re[i][4]);
  74.        
  75.                         putchar('\n');
  76.                         }
  77.                         putchar('\n');
  78.                 }
  79.        
  80.        
  81.        
  82.                 return 0;

  83. }
复制代码

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

最佳答案

查看完整内容

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

使用道具 举报

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

  2. int main()
  3. {
  4.         int count,a,b,c,d,e,p;
  5.         char k;
  6.         int i=0,test=1;
  7.         int re[100][5];
  8.         printf("输入:");
  9.         scanf("%d",&count);
  10.                 a=3;
  11.         while(a<=count)
  12.         {
  13.                 b=a*a*a;//立方数
  14.                 d=1;  //首项
  15.                 p=1;  //项数
  16.                 while(1)
  17.                 {
  18.                         p++;  //首项为1时,不断增加项数
  19.                         c=(d+(d+(p-1)*2))*p/2;//利用(首项+末项)*项数/2
  20.                         if(c==b)  //试数正确时,则保存数据
  21.                         {
  22.                                 e=d+(p-1)*2;//末项
  23.                                         re[i][0]= a;
  24.                                         re[i][1]= b;
  25.                                         re[i][2]= d;
  26.                                         re[i][3]= d+2;
  27.                                         re[i][4]= e;
  28.                                                                     i++;
  29.                                         c=0;
  30.                                 break;//跳出内循环,换立方根
  31.                         }
  32.                         if(c>b)  //试数错误,则重置数据,改变首项,继续试数
  33.                         {
  34.                                 d+=2;
  35.                                 c=0;
  36.                                 p=1;
  37.                         }
  38.                         if(d>b/2)//若首项大于立方数的一半,则停止试数,结论错误
  39.                         {
  40.                                 test=0;
  41.                                 break;
  42.                         }
  43.        
  44.                 }
  45.                 if(d>b/2)
  46.                 {
  47.                         break;
  48.                 }
  49.                 a++;
  50.         }
  51.        
  52.         if(test==1)
  53.         {
  54.                 printf("结论正确!\n");
  55.         }
  56.         else
  57.         {
  58.                 printf("结论错误!\n");
  59.         }
  60.         getchar();
  61.        
  62.                 printf("是否打印(y/n):");
  63.                 scanf("%c",&k);
  64.        
  65.                 if(k=='y')
  66.        
  67.                 {
  68.        
  69.        
  70.                         for(i=0;i<count-2;i++)
  71.                         {
  72.        
  73.                 printf("%d^3 = %d = %d + %d + ... + %d",re[i][0],re[i][1],re[i][2],re[i][3],re[i][4]);
  74.        
  75.                         putchar('\n');
  76.                         }
  77.                         putchar('\n');
  78.                 }
  79.        
  80.        
  81.        
  82.                 return 0;

  83. }
复制代码

格式由于直接复制你的代码,没认真调,你将就看一下,输出结果是正确的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  12.         if(k=='y')

  13.         {


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

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

  17.                 putchar('\n');
  18.                 }
  19.                 putchar('\n');
  20.         }



  21.         return 0;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

这是后面的代码,后面的数组打印出来全是乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-22 00:34:16 | 显示全部楼层
你可不可以发完整的代码?谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

谢了我的哥,不过为啥i++在前面第一行赋不了值呀?我给i的初始值就是0呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

为什么a++的位置也会有影响呢?在前在后的区别在哪里
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

a++的return值不应该是++之前的值吗——就是a=3,a++后,第一次循环时,a不是以3的身份进行循环吗
小甲鱼最新课程 -> https://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循环,就不用了纠结放在哪里,直接把
  1.         while(a<=count)
复制代码

改成
  1. for(a;a<=count;a++)
复制代码

就好了。这种情况正常用for循环是很合适的。
小甲鱼最新课程 -> https://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++要删掉
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

谢谢哥
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 14:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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