鱼C论坛

 找回密码
 立即注册
查看: 1831|回复: 4

[已解决]为什么我用break不能达到同样的效果

[复制链接]
发表于 2022-9-7 21:33:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
最佳答案
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:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
906609 = 913 x 993

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2022-9-7 21:47:31 | 显示全部楼层
ba21 发表于 2022-9-7 21:40
#include

int main()

为什么第二个break前面要加if(flag),无条件执行不也能退出循环吗?  上面for (i = 100; i < 1000; i++)没执行完,会向下执行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
906609 = 913 x 993

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-8 06:30:40 | 显示全部楼层
本帖最后由 jhq999 于 2022-9-8 06:35 编辑

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 21:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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