程序运行过程中的小状况,实在不解,难以百度,特来求解
本帖最后由 大大怪将军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:48 编辑
问题已解决,封贴
很小的细节错误,已发现。感谢各位的细心指教 建议代码直接复制上来,方便别人帮你调试,
还有你这帖子怎么乱成这样子??? 不用从 100 到 1000,直接从 1000 到 100 就行了,第一个回文数就是最大的回文数。 #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;
} isdkz 发表于 2022-2-13 12:25
建议代码直接复制上来,方便别人帮你调试,
还有你这帖子怎么乱成这样子???
刚来论坛不太熟悉,从Word粘贴过来就成这样了0.0 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;
} 傻眼貓咪 发表于 2022-2-13 13:23
十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您能帮我看看嘛,十分感谢! 大大怪将军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;
} isdkz 发表于 2022-2-13 16:02
我也没搞明白这点,我用你的代码测试了一下,加上一点点的停顿就可以,不停顿结果也是0
十分感谢您这么认真地对待,我把这个情况记录在自己的云笔记了,以后有机会遇到了大神一定要解决这个疑惑!感谢! 大大怪将军619 发表于 2022-2-13 14:49
十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您 ...
抱歉,才看见你的问题。
你的代码 biggest 由始至终都没有赋值(因为是局部变量,所以是随机值),但是你用于和 temp 比大小(无意义,因为本来 biggest 的值就是不对)
页:
[1]