开启左侧

排它平方数

二维码 [复制链接]
207 0
小明正看着 203879 这个数字发呆。

    原来,203879 * 203879 = 41566646641

    这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。

    具有这样特点的6位数还有一个,请你找出它!

    再归纳一下筛选要求:
    1. 6位正整数
    2. 每个数位上的数字不同
    3. 其平方数的每个数位不含原数字的任何组成数位

答案是一个6位的正整数。

  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. // 定义BOOL类型
  4. typedef enum
  5. {
  6.     FALSE = 0,
  7.     TRUE  = 1
  8. }BOOL;

  9. // 定义64位整数类型
  10. #ifdef _WIN32
  11. typedef __int64 INT64;
  12. #else
  13. typedef long long INT64;
  14. #endif

  15. /**************************************************************************
  16. * - 名称: isAllDiff
  17. * - 功能: 判断数字x是否与其他数都不相同
  18. * - 入参: x - 待判断的数字
  19. *         count - 需要与x比较的数字的个数
  20. * - 出参: 无
  21. * - 返回: BOOL
  22. * - 备注: 无                       
  23. **************************************************************************/
  24. BOOL isAllDiff(int x, int count, ...)
  25. {
  26.     va_list args;
  27.     int i = 0;
  28.    
  29.     va_start(args, count);
  30.     for (i = 0; i < count; ++i)
  31.     {
  32.         if (x == va_arg(args, int)) // 发现有相同直接返回
  33.         {
  34.             va_end(args);
  35.             return FALSE;
  36.         }
  37.     }

  38.     va_end(args);
  39.     return TRUE; // x与其他数字均不相同
  40. }

  41. /**************************************************************************
  42. * - 名称: checkSquare
  43. * - 功能: 检查平方数是否满足排他性
  44. * - 入参: square - 平方数
  45. *         abcdef - 原数的各位
  46. * - 出参: 无
  47. * - 返回: BOOL
  48. * - 备注: 无                       
  49. **************************************************************************/
  50. BOOL checkSquare(INT64 square, int a, int b, int c, int d, int e, int f)
  51. {
  52.     int digit = 0;
  53.    
  54.     while (0 < square)
  55.     {
  56.         digit = (int)(square % 10);
  57.         if (!isAllDiff(digit, 6, a, b, c, d, e, f))
  58.         {
  59.             return FALSE;
  60.         }
  61.         
  62.         square /= 10;
  63.     }
  64.    
  65.     return TRUE;
  66. }

  67. int main()
  68. {
  69.     int a, b, c, d, e, f;   // 代表6位数abcdef
  70.     int number = 0;         // 由abcdef组成的6位数
  71.     INT64 square = 0;       // 6位数number的平方
  72.    
  73.     for (a = 9; a > 0; a--)
  74.     {
  75.         for (b = 9; b >= 0; b--)
  76.         {
  77.             if (!isAllDiff(b, 1, a))
  78.             {
  79.                 continue;
  80.             }
  81.             for (c = 9; c >= 0; c--)
  82.             {
  83.                 if (!isAllDiff(c, 2, a, b))
  84.                 {
  85.                     continue;
  86.                 }
  87.                 for (d = 9; d >= 0; d--)
  88.                 {
  89.                     if (!isAllDiff(d, 3, a, b, c))
  90.                     {
  91.                         continue;
  92.                     }
  93.                     for (e = 9; e >= 0; e--)
  94.                     {
  95.                         if (!isAllDiff(e, 4, a, b, c, d))
  96.                         {
  97.                             continue;
  98.                         }
  99.                         for (f = 9; f > 0; f--)
  100.                         {
  101.                             if (!isAllDiff(f, 5, a, b, c, d, e))
  102.                             {
  103.                                 continue;
  104.                             }

  105.                             // 个位为1或5或6的数不满足排他性
  106.                             if (1 == f || 5 == f || 6 == f)
  107.                             {
  108.                                 continue;
  109.                             }
  110.                            
  111.                             number = f + e * 10 + d * 100 + c * 1000 + b * 10000 + a * 100000;
  112.                             square = (INT64)number * (INT64)number;
  113.                            
  114.                             if (checkSquare(square, a, b, c, d, e, f) && 203879 != number)
  115.                             {
  116.                                 printf("%d\n", number);
  117.                                 
  118.                                 return 0;
  119.                             }
  120.                         }
  121.                     }
  122.                 }
  123.             }
  124.         }
  125.     }
  126.    
  127.     printf("can not find the number.\n"); // 没有找到满足条件的数字
  128.    
  129.     return 0;
  130. }
复制代码
这个例题代码量稍多,但效率上还算可以,大家可以试着简化下代码量


赞助本站





上一篇:高斯日记
下一篇:颠倒的价牌
学会善用【论坛搜索】功能,很多你要寻找的答案就在这里面;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

发新帖 回复

104

主题

104

帖子

233

街币
更多

精彩推荐

新人报到专用贴
新人报到专用贴
==新人报道格式(选填)== 【我的昵称】: 【我的性别
爱好街资源共享区文件解压密码
爱好街资源共享区文件解压密码
因本站分享的文件实在太多,目前收集整理已经接近4T,所以有些文
独立团VIP教程第1-7版全套打包下载(含课件源码工具等)
独立团VIP教程第1-7版全套打包
独立团第1版易语言教程 独立团第一版1易语言入门 1-1-1外
爱好街链接地址失效有奖报错
爱好街链接地址失效有奖报错
我们的成长离不开大家的支持!! 各位爱好街的会员:
魔鬼作坊vip教程辅助制作培训之零基础绝密汇编语言入门课程
魔鬼作坊vip教程辅助制作培训
这套课程为汇编入门教程,学习游戏逆向反汇编需要用到的基础知
万挂作坊教程+封包+E模块(全套下载)
万挂作坊教程+封包+E模块(全套
万挂-封包 封包加密解密-01 封包加密解密-02 封包加密

免责声明:
在爱好街发布的文章与主题属会员个人意见,与本站立场无关,文章内容由作者与爱好街享有相关版权,如需转载请注明出处或取得会员与本站的许可,否则本站将追究相应的法律责任,如部分内容有侵犯任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意。另外不得将本站内容用于商业或者非法用途,否则,一切后果请用户自负。

Mail To:MasTer@AiHaiJie.Com

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