鱼C论坛

 找回密码
 立即注册
查看: 1365|回复: 10

[已解决]程序运行过程中的小状况,实在不解,难以百度,特来求解

[复制链接]
发表于 2022-2-13 12:04:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 大大怪将军619 于 2022-2-13 12:04 编辑

本程序(图一)用于求三位数相乘得到的最大回文数现遇到如下问题:

图一

图一
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5028\wps1.jpg
图一


                               
登录/注册后可看大图


Line13的代码如果不注释,则程序可正常运行并得出正确结果(图二)。但花费时间极长,程序需改进,已有思路,且问题不在于此

图二

图二
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5028\wps2.jpg
图二

但如果把line13的语句注释掉,程序就不能正确运行了(图三)!?  编程经验有限,实在想不出为何一条 printf 能影响程序的正常运行?

图三

图三
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5028\wps3.jpg
图三


虽然题目可以进行优化解出问题,但这种情况实在是百思不得其解!?

真心求教!十分感谢!


最佳答案
2022-2-13 13:23:41
  1. #include <stdio.h>

  2. int palindrome(int);

  3. int main()
  4. {
  5.     int num, flag = 1; // flag 为退出循环的条件标识
  6.    
  7.     /* 从 999 开始循环至 99 便可得知三位数相乘的最大回文数 */
  8.     for(int a = 999; a > 99 && flag; a--)
  9.     for(int b = 999; b > 99 && flag; b--){
  10.         if(palindrome(a*b)){
  11.             printf("%d * %d = %d", a, b, a*b);
  12.             flag = 0;
  13.         }
  14.     }
  15.     return 0;
  16. }

  17. /* ----- 回文数判断 ----- */
  18. int palindrome(int num){
  19.     if(!(num%10)) return 0;
  20.     int a = num;
  21.     int b = 0;
  22.     while(num){
  23.         b *= 10;
  24.         b += num%10;
  25.         num /= 10;
  26.     }
  27.     return a == b;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-13 15:47:17 | 显示全部楼层
本帖最后由 大大怪将军619 于 2022-2-13 15:48 编辑

问题已解决,封贴

很小的细节错误,已发现。感谢各位的细心指教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 12:25:49 | 显示全部楼层
建议代码直接复制上来,方便别人帮你调试,

还有你这帖子怎么乱成这样子???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 12:33:11 | 显示全部楼层
不用从 100 到 1000,直接从 1000 到 100 就行了,第一个回文数就是最大的回文数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-2-13 13:23:41 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. int palindrome(int);

  3. int main()
  4. {
  5.     int num, flag = 1; // flag 为退出循环的条件标识
  6.    
  7.     /* 从 999 开始循环至 99 便可得知三位数相乘的最大回文数 */
  8.     for(int a = 999; a > 99 && flag; a--)
  9.     for(int b = 999; b > 99 && flag; b--){
  10.         if(palindrome(a*b)){
  11.             printf("%d * %d = %d", a, b, a*b);
  12.             flag = 0;
  13.         }
  14.     }
  15.     return 0;
  16. }

  17. /* ----- 回文数判断 ----- */
  18. int palindrome(int num){
  19.     if(!(num%10)) return 0;
  20.     int a = num;
  21.     int b = 0;
  22.     while(num){
  23.         b *= 10;
  24.         b += num%10;
  25.         num /= 10;
  26.     }
  27.     return a == b;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-2-13 14:41:43 | 显示全部楼层
isdkz 发表于 2022-2-13 12:25
建议代码直接复制上来,方便别人帮你调试,

还有你这帖子怎么乱成这样子???

刚来论坛不太熟悉,从Word粘贴过来就成这样了0.0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-13 14:47:04 | 显示全部楼层
isdkz 发表于 2022-2-13 12:25
建议代码直接复制上来,方便别人帮你调试,

还有你这帖子怎么乱成这样子???
  1. #include <stdio.h>

  2. int Upside_Down( int temp );         //用以计算传入值的倒置数

  3. int main(){
  4.         int num, upside;        //num为要判断的数,upside是其回文数
  5.         int i, j, temp, biggest;
  6.        
  7.         for( i = 100 ; i<1000 ; i++ ){
  8.                 for( j = i ; j<1000 ; j++ ){
  9.                         num = i*j ;                        //此处代码可精简,只是没有精简的必要,精简后代码可读性将大大降低
  10.                         upside = Upside_Down( num );
  11.                         //printf("正在比对%4d * %4d = %8d和%8d。。。\n", i, j, num, upside);
  12.                         if( num - upside == 0 ){
  13.                                 printf("%8d是回文数!\n");
  14.                                 temp = num ;
  15.                                 if( temp > biggest )
  16.                                         biggest = temp;
  17.                         }
  18.                 }
  19.         }
  20.         printf("最大的由两个三位数的乘积构成的回文数是:%d", biggest);
  21.        
  22.         return 0;
  23. }

  24. int Upside_Down( int temp ){                //用以计算传入值的倒置数
  25.         int upside, last;
  26.        
  27.         while( temp ){        //temp不为0则持续循环
  28.                 last = temp % 10;        //取temp的最后一位
  29.                 temp = temp / 10;        //截去最后一位
  30.                 upside = 10*upside + last;        //将最后一位加到逆置数最后   
  31.         }
  32.        
  33.         return upside;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-13 14:49:20 | 显示全部楼层

十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您能帮我看看嘛,十分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 16:02:34 | 显示全部楼层
大大怪将军619 发表于 2022-2-13 14:49
十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您 ...


我也没搞明白这点,我用你的代码测试了一下,加上一点点的停顿就可以,不停顿结果也是0

  1. #include <stdio.h>
  2. #include <windows.h>              //    加了这句,为了使用Sleep

  3. int Upside_Down( int temp );         //用以计算传入值的倒置数

  4. int main(){
  5.         int num, upside;        //num为要判断的数,upside是其回文数
  6.         int i, j, temp, biggest;
  7.         
  8.         for( i = 100 ; i<1000 ; i++ ){
  9.                 for( j = i ; j<1000 ; j++ ){
  10.                         num = i*j ;                        //此处代码可精简,只是没有精简的必要,精简后代码可读性将大大降低
  11.                         upside = Upside_Down( num );
  12.                         //printf("正在比对%4d * %4d = %8d和%8d。。。\n", i, j, num, upside);
  13.                         Sleep(0.000000001);                   //    加了这句,让IO中断一小会儿
  14.                         if( num - upside == 0 ){
  15.                                 printf("%8d是回文数!\n", num);      //  改了这句,你原来的代码少了num
  16.                                 temp = num ;
  17.                                 if( temp > biggest )
  18.                                         biggest = temp;
  19.                         }
  20.                 }
  21.         }
  22.         printf("最大的由两个三位数的乘积构成的回文数是:%d", biggest);
  23.         
  24.         return 0;
  25. }

  26. int Upside_Down( int temp ){                //用以计算传入值的倒置数
  27.         int upside, last;
  28.         
  29.         while( temp ){        //temp不为0则持续循环
  30.                 last = temp % 10;        //取temp的最后一位
  31.                 temp = temp / 10;        //截去最后一位
  32.                 upside = 10*upside + last;        //将最后一位加到逆置数最后   
  33.         }
  34.         
  35.         return upside;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-2-13 20:15:09 | 显示全部楼层
isdkz 发表于 2022-2-13 16:02
我也没搞明白这点,我用你的代码测试了一下,加上一点点的停顿就可以,不停顿结果也是0

十分感谢您这么认真地对待,我把这个情况记录在自己的云笔记了,以后有机会遇到了大神一定要解决这个疑惑!感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 20:42:25 | 显示全部楼层
大大怪将军619 发表于 2022-2-13 14:49
十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您 ...


抱歉,才看见你的问题。
你的代码 biggest 由始至终都没有赋值(因为是局部变量,所以是随机值),但是你用于和 temp 比大小(无意义,因为本来 biggest 的值就是不对)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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