鱼C论坛

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

[已解决]C第一阶段考核回文数问题

[复制链接]
发表于 2021-1-13 17:27:32 | 显示全部楼层 |阅读模式

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

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

x
兄弟姐妹们,有人能帮我看一下,为什么我写的这段代码出来的结果是0呢???

原题目如下图:

                               
登录/注册后可看大图


我写的代码如下:
  1. #include<stdio.h>

  2. int main()
  3. {
  4.     int i, j, num, num0 = 0, temp, max = 0;

  5.     for(i = 10; i < 100; i++)
  6.     {
  7.         for(j = 10; j <= i; j++)
  8.         {
  9.             num = i * j;
  10.             temp = num;

  11.             while(temp)//求该数的倒置数
  12.             {
  13.                 num0 = num0 * 10 + temp % 10;
  14.                 temp /= 10;
  15.             }

  16.             if(num0 == num)//判断是否回文数
  17.             {
  18.                 if(max < num)
  19.                 {
  20.                     max = num;
  21.                 }
  22.             }
  23.         }
  24.     }

  25.     printf("最大的由三位数乘积构成的回文数是:%d\n", max);

  26.     return 0;
  27. }
复制代码


最佳答案
2021-1-13 21:43:23
本帖最后由 jackz007 于 2021-1-13 21:47 编辑
  1. #include <stdio.h>

  2. int foo(int n , int * a , int * b)
  3. {
  4.         int d , e , i , j , r                                    ;
  5.         for(r = d = 0 , e = n ; e ; e /= 10) d = d * 10 + e % 10 ;
  6.         if(d == n) {
  7.                 for(i = 100 ; i * i < n + 1 ; i ++) {
  8.                         if(! (n % i)) {
  9.                                 j = n / i                        ;
  10.                                 if(i > 99 && i < 1000 && j > 99 && j < 1000) {
  11.                                         * a = i                  ;
  12.                                         * b = j                  ;
  13.                                         r = 1                    ;
  14.                                         break                    ;
  15.                                 }
  16.                         }
  17.                 }
  18.         }
  19.         return r                                                 ;
  20. }

  21. int main(void)
  22. {
  23.         int i , j , k                                            ;
  24.         for(k = 999 * 999 ; k > 99 * 99 ; k --) {
  25.                 if(foo(k , & i , & j)) {
  26.                         printf("%d = %d * %d\n" , k , i , j)     ;
  27.                         break                                    ;
  28.                 }
  29.         }
  30. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 906609 = 913 * 993

  4. D:\00.Excise\C>
复制代码

        你算出来和这个答案一样吗? 可以肯定地说,906609 一定是所有两个 3 位数乘积所得回文数中最大的那一个。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-13 17:29:02 | 显示全部楼层
原题目:
3. 找出最大的有由两个三位数乘积构成的回文数。
一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是 9009 = 91 * 99。
由于这道题比较难,放点提示给大家吧
提示:判断一个数是否为回文数,你可以先求该数的倒置数(比如 123 的倒置数是 321),如果倒置数等于本身,那么就说明这是一个回文数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-13 20:11:02 | 显示全部楼层
解决了!
循环回收没处理好。。。num0循环后没有回收。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 21:43:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-13 21:47 编辑
  1. #include <stdio.h>

  2. int foo(int n , int * a , int * b)
  3. {
  4.         int d , e , i , j , r                                    ;
  5.         for(r = d = 0 , e = n ; e ; e /= 10) d = d * 10 + e % 10 ;
  6.         if(d == n) {
  7.                 for(i = 100 ; i * i < n + 1 ; i ++) {
  8.                         if(! (n % i)) {
  9.                                 j = n / i                        ;
  10.                                 if(i > 99 && i < 1000 && j > 99 && j < 1000) {
  11.                                         * a = i                  ;
  12.                                         * b = j                  ;
  13.                                         r = 1                    ;
  14.                                         break                    ;
  15.                                 }
  16.                         }
  17.                 }
  18.         }
  19.         return r                                                 ;
  20. }

  21. int main(void)
  22. {
  23.         int i , j , k                                            ;
  24.         for(k = 999 * 999 ; k > 99 * 99 ; k --) {
  25.                 if(foo(k , & i , & j)) {
  26.                         printf("%d = %d * %d\n" , k , i , j)     ;
  27.                         break                                    ;
  28.                 }
  29.         }
  30. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. 906609 = 913 * 993

  4. D:\00.Excise\C>
复制代码

        你算出来和这个答案一样吗? 可以肯定地说,906609 一定是所有两个 3 位数乘积所得回文数中最大的那一个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-14 13:39:17 | 显示全部楼层
jackz007 发表于 2021-1-13 21:43
编译、运行实况

        你算出来和这个答案一样吗? 可以肯定地说,906609 一定是所有两个 3 ...

感谢!算出来答案跟你的一样!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 20:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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