大大怪将军619 发表于 2022-2-13 12:04:01

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

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

本程序(图一)用于求三位数相乘得到的最大回文数,现遇到如下问题:file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml5028\wps1.jpg
图一
static/image/hrline/line3.png

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
图三

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

真心求教!十分感谢!


大大怪将军619 发表于 2022-2-13 15:47:17

本帖最后由 大大怪将军619 于 2022-2-13 15:48 编辑

问题已解决,封贴

很小的细节错误,已发现。感谢各位的细心指教

isdkz 发表于 2022-2-13 12:25:49

建议代码直接复制上来,方便别人帮你调试,

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

ckblt 发表于 2022-2-13 12:33:11

不用从 100 到 1000,直接从 1000 到 100 就行了,第一个回文数就是最大的回文数。

傻眼貓咪 发表于 2022-2-13 13:23:41

#include <stdio.h>

int palindrome(int);

int main()
{
    int num, flag = 1; // flag 为退出循环的条件标识
   
    /* 从 999 开始循环至 99 便可得知三位数相乘的最大回文数 */
    for(int a = 999; a > 99 && flag; a--)
    for(int b = 999; b > 99 && flag; b--){
      if(palindrome(a*b)){
            printf("%d * %d = %d", a, b, a*b);
            flag = 0;
      }
    }
    return 0;
}

/* ----- 回文数判断 ----- */
int palindrome(int num){
    if(!(num%10)) return 0;
    int a = num;
    int b = 0;
    while(num){
      b *= 10;
      b += num%10;
      num /= 10;
    }
    return a == b;
}

大大怪将军619 发表于 2022-2-13 14:41:43

isdkz 发表于 2022-2-13 12:25
建议代码直接复制上来,方便别人帮你调试,

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

刚来论坛不太熟悉,从Word粘贴过来就成这样了0.0

大大怪将军619 发表于 2022-2-13 14:47:04

isdkz 发表于 2022-2-13 12:25
建议代码直接复制上来,方便别人帮你调试,

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

#include <stdio.h>

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

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

int Upside_Down( int temp ){                //用以计算传入值的倒置数
        int upside, last;
       
        while( temp ){        //temp不为0则持续循环
                last = temp % 10;        //取temp的最后一位
                temp = temp / 10;        //截去最后一位
                upside = 10*upside + last;        //将最后一位加到逆置数最后   
        }
       
        return upside;
}

大大怪将军619 发表于 2022-2-13 14:49:20

傻眼貓咪 发表于 2022-2-13 13:23


十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您能帮我看看嘛,十分感谢!

isdkz 发表于 2022-2-13 16:02:34

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

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

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

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

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

int Upside_Down( int temp ){                //用以计算传入值的倒置数
      int upside, last;
      
      while( temp ){      //temp不为0则持续循环
                last = temp % 10;      //取temp的最后一位
                temp = temp / 10;      //截去最后一位
                upside = 10*upside + last;      //将最后一位加到逆置数最后   
      }
      
      return upside;
}

大大怪将军619 发表于 2022-2-13 20:15:09

isdkz 发表于 2022-2-13 16:02
我也没搞明白这点,我用你的代码测试了一下,加上一点点的停顿就可以,不停顿结果也是0

十分感谢您这么认真地对待,我把这个情况记录在自己的云笔记了,以后有机会遇到了大神一定要解决这个疑惑!感谢!

傻眼貓咪 发表于 2022-2-13 20:42:25

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

抱歉,才看见你的问题。
你的代码 biggest 由始至终都没有赋值(因为是局部变量,所以是随机值),但是你用于和 temp 比大小(无意义,因为本来 biggest 的值就是不对)
页: [1]
查看完整版本: 程序运行过程中的小状况,实在不解,难以百度,特来求解