鱼C论坛

 找回密码
 立即注册
查看: 1109|回复: 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
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

问题已解决,封贴

很小的细节错误,已发现。感谢各位的细心指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还有你这帖子怎么乱成这样子???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-13 12:33:11 | 显示全部楼层
不用从 100 到 1000,直接从 1000 到 100 就行了,第一个回文数就是最大的回文数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

刚来论坛不太熟悉,从Word粘贴过来就成这样了0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

十分感谢,思路已有,就是想不清楚为什么按原来那个思路,注释一条printf会产生不同的结果,代码已挂,您能帮我看看嘛,十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

十分感谢您这么认真地对待,我把这个情况记录在自己的云笔记了,以后有机会遇到了大神一定要解决这个疑惑!感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 13:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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