SilverAz 发表于 2022-9-7 21:33:40

为什么我用break不能达到同样的效果

#include <stdio.h>

int main()
{
      int i, j, target, invert = 0, num = 998001; // 999 * 999

      for ( ; num > 10000; num--)
      {
                // 先求倒置数
                target = num;
                invert = 0;
                while (target)
                {
                        invert = invert * 10 + target % 10;
                        target = target / 10;
                }

                // 如果跟倒置数一致,说明该数是回文数
                if (invert == num)
                {
                        for (i = 100; i < 1000; i++)
                        {
                              if (!(num % i) && (num / i >= 100) && (num / i < 1000))
                              {
                                        break;//终止for循环,执行if语句
                                                                               
                                                                                //goto FINDIT;
                              }
                        }
                }
            break;//if语句执行完,执行for语句下面内容break;终止for循环
      }
        printf("结果是%d == %d * %d\n", num, i, num / i);//输出结果

//FINDIT: printf("结果是%d == %d * %d\n", num, i, num / i);

      return 0;
}

参考答案

#include <stdio.h>

int main()
{
      int i, j, target, invert = 0, num = 998001; // 999 * 999

      for ( ; num > 10000; num--)
      {
                // 先求倒置数
                target = num;
                invert = 0;
                while (target)
                {
                        invert = invert * 10 + target % 10;
                        target = target / 10;
                }

                // 如果跟倒置数一致,说明该数是回文数
                if (invert == num)
                {
                        for (i = 100; i < 1000; i++)
                        {
                              if (!(num % i) && (num / i >= 100) && (num / i < 1000))
                              {
                                        goto FINDIT;
                              }
                        }
                }
      }

FINDIT: printf("结果是%d == %d * %d\n", num, i, num / i);

      return 0;
}

ba21 发表于 2022-9-7 21:40:37

#include <stdio.h>

int main()
{
      int i, j, target, invert = 0, num = 998001; // 999 * 999
int flag = 0;

      for ( ; num > 10000; num--)
      {
                // 先求倒置数
                target = num;
                invert = 0;
                while (target)
                {
                        invert = invert * 10 + target % 10;
                        target = target / 10;
                }

                // 如果跟倒置数一致,说明该数是回文数
                if (invert == num)
                {
                        for (i = 100; i < 1000; i++)
                        {
                              if (!(num % i) && (num / i >= 100) && (num / i < 1000))
                              {
                                        flag=1;
                                        break;//终止for循环,执行if语句
                                                                              
                                                                              //goto FINDIT;
                              }
                        }
                }
        if (flag) break;//if语句执行完,执行for语句下面内容break;终止for循环
      }
      printf("结果是%d == %d * %d\n", num, i, num / i);//输出结果

//FINDIT: printf("结果是%d == %d * %d\n", num, i, num / i);

      return 0;
}

SilverAz 发表于 2022-9-7 21:47:31

ba21 发表于 2022-9-7 21:40
#include

int main()


为什么第二个break前面要加if(flag),无条件执行不也能退出循环吗?上面for (i = 100; i < 1000; i++)没执行完,会向下执行吗

jackz007 发表于 2022-9-7 22:44:29

本帖最后由 jackz007 于 2022-9-7 22:54 编辑

      C 是结构化编程语言,必须绝对禁止使用 goto 语句
#include <stdio.h>

// 判断 m 是否回文数
int foo(int m)
{
      int d , n , r                                          ;
      for(n = m , d = r = 0 ; n ; n /= 10) d = d * 10 + n % 10 ;
      if(d == m) r = 1                                       ;
      return r                                                 ;
}

// 判断 m 是否回文数,并且,判断 m 是否可以被分解为两个三位数的乘积
int check(int m , int * q)
{
      int d , r                                                ;
      * q = r = 0                                              ;
      if(foo(m)) {
                for(d = 100 ; d < 1000 ; d ++) {
                        if(! (m % d) && && m / d > 99 && m / d < 1000) {
                              r = 1                            ;
                              * q = d                        ;
                              break                            ;
                     }
                }
      }
      return r                                                 ;
}

int main(void)
{
      int d , k                                                ;
      for(k = 998001 ; k > 10000 ; k --) {
                if(check(k , & d)) {
                        printf("%d = %d x %d\n" , k , d , k / d) ;
                        break                                    ;
                }
      }
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
906609 = 913 x 993

D:\\C>

jhq999 发表于 2022-9-8 06:30:40

本帖最后由 jhq999 于 2022-9-8 06:35 编辑

{:5_109:}
页: [1]
查看完整版本: 为什么我用break不能达到同样的效果