鱼C论坛

 找回密码
 立即注册
查看: 854|回复: 5

[已解决]关于自己写的代码 如何跳出出for 语句的问题

[复制链接]
发表于 2020-3-22 20:20:30 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 Justin1 于 2020-3-22 20:20 编辑

#include<stdio.h>

int main()
{
        long int a,b,num,i,j;
        _Bool flag = 1;
        
        num = 998001;
        do
        {
                i = num;
            j = 0;
                while(i)
                {
                        j = j * 10 + i % 10;
            i = i / 10;        
                }
                if (j==num)
                {
                        for ( a = 999 ; a>100  ; a-- )
                        {
                                if ( !(num % a) && (num / a >= 100) && (num / a < 1000) )
                                {
                                        goto FINDIT;
                                }
                                
                        }
                }
                else
                {
                        num -=1;
                }
            
        }
        while (flag);
        
FINDIT: printf("结果是%d == %d * %d\n", num, a, num/a);        
        
        return 0;
               
}



题目要求找出最大的回文数,并且是由两个三位数相乘。我们不妨先求出两个最大的三位数 999 * 999 的乘积,然后逐个递减判断是否回文数。

甲鱼的答案我看懂了,但是自己的这部分弄了一个小时知道哪里错了,但不会改。

应该是   最里面的for 循环挑不出来的缘故
最佳答案
2020-3-22 20:20:31
本帖最后由 sunrise085 于 2020-3-22 21:09 编辑

之所以跳不出循环,是因为你把num-=1写在else中了。
在你的程序中,一旦找到一个回文数,就会进入if(j==num)模块,若该回文数不符合条件(不是两个三位数乘积),则不会执行goto语句,但是因为进入了if语句块则不会进入else语句块,那样num则不会在改变,会一直在while内循环,进入了死循环。

发代码:在发帖界面,上方有各种功能,有一个像是  '<>'  的按钮,是用来发代码的。

另外C语言中尽量少用goto语句。你的程序完全可以使用break跳出来。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         long int a,b,num,i,j;
  5.         _Bool flag = 1;
  6.         num = 998001;
  7.         do
  8.         {
  9.                 i = num;
  10.                 j = 0;
  11.                 while(i)
  12.                 {
  13.                         j = j * 10 + i % 10;
  14.                         i = i / 10;        
  15.                 }
  16.                 if (j==num)
  17.                 {
  18.                         for ( a = 999 ; a>100  ; a-- )
  19.                         {
  20.                                 if ( !(num % a) && (num / a >= 100) && (num / a < 1000) )
  21.                                 {
  22.                                         flag=0;
  23.                                         break;
  24.                                 }
  25.                         }
  26.                 }
  27.                 num -=1;
  28.         }while (flag);
  29.         printf("结果是%d == %d * %d\n", num+1, a, (num+1)/a);        
  30.         return 0;
  31. }
复制代码

最佳答案

查看完整内容

之所以跳不出循环,是因为你把num-=1写在else中了。 在你的程序中,一旦找到一个回文数,就会进入if(j==num)模块,若该回文数不符合条件(不是两个三位数乘积),则不会执行goto语句,但是因为进入了if语句块则不会进入else语句块,那样num则不会在改变,会一直在while内循环,进入了死循环。 发代码:在发帖界面,上方有各种功能,有一个像是 '' 的按钮,是用来发代码的。 另外C语言中尽量少用goto语句。你的程序完全可 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-22 20:20:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-22 21:09 编辑

之所以跳不出循环,是因为你把num-=1写在else中了。
在你的程序中,一旦找到一个回文数,就会进入if(j==num)模块,若该回文数不符合条件(不是两个三位数乘积),则不会执行goto语句,但是因为进入了if语句块则不会进入else语句块,那样num则不会在改变,会一直在while内循环,进入了死循环。

发代码:在发帖界面,上方有各种功能,有一个像是  '<>'  的按钮,是用来发代码的。

另外C语言中尽量少用goto语句。你的程序完全可以使用break跳出来。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         long int a,b,num,i,j;
  5.         _Bool flag = 1;
  6.         num = 998001;
  7.         do
  8.         {
  9.                 i = num;
  10.                 j = 0;
  11.                 while(i)
  12.                 {
  13.                         j = j * 10 + i % 10;
  14.                         i = i / 10;        
  15.                 }
  16.                 if (j==num)
  17.                 {
  18.                         for ( a = 999 ; a>100  ; a-- )
  19.                         {
  20.                                 if ( !(num % a) && (num / a >= 100) && (num / a < 1000) )
  21.                                 {
  22.                                         flag=0;
  23.                                         break;
  24.                                 }
  25.                         }
  26.                 }
  27.                 num -=1;
  28.         }while (flag);
  29.         printf("结果是%d == %d * %d\n", num+1, a, (num+1)/a);        
  30.         return 0;
  31. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-22 20:21:07 | 显示全部楼层
另外如何发带有灰色边框行数的代码呀,小白不大会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-23 10:02:41 | 显示全部楼层
Justin1 发表于 2020-3-22 20:21
另外如何发带有灰色边框行数的代码呀,小白不大会

在发贴的编辑框图标中有个 <> 符号,点一下就可以把代码粘贴进去,发出来就是带行号的代码格式了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-23 10:28:46 | 显示全部楼层
chxchxkkk 发表于 2020-3-23 10:02
在发贴的编辑框图标中有个  符号,点一下就可以把代码粘贴进去,发出来就是带行号的代码格式了

谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-23 10:31:17 | 显示全部楼层
sunrise085 发表于 2020-3-22 20:20
之所以跳不出循环,是因为你把num-=1写在else中了。
在你的程序中,一旦找到一个回文数,就会进入if(j==nu ...

谢谢dl,我思考了很久只是找到了错误点,还是结构的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 05:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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