7-76 寻找完美数

所有真因子之和小于其本身的数称为亏数。如:4 的真因子 1、2 之和为 3,小于 4,是亏数。

所有真因子之和大于其本身的数称为盈数。如:12 的真因子 1、2、3、4、6 之和为 16,大于 12,是盈数。

不盈不亏的数,即:所有真因子之和等于其本身的数,称为完美数。如:6 的真因子 1、2、3 之和恰为 6,是完美数。

请编写程序,显示指定范围内的完美数。

输入格式

两个正整数 a 和 b,且 a ≤ b,即区间 [a, b] 的下限和上限。

输出格式

若区间内存在完美数,则在一行内输出全部完美数,以空格间隔。若区间不存在完美数,则输出“None”。

输入样例1

1 30

输出样例1

6 28

输入样例2

100 400

输出样例2

None

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路:

这道题需要判断给定区间内哪些数是完美数。完美数是指它所有的因子之和等于它本身的正整数。例如,6 的因子为 1, 2, 3,它们之和为 6,因此 6 是完美数。

我们可以遍历给定的区间内的每个数字,计算它所有因子的和,并将该和与该数进行比较。如果两数相等,则该数是一个完美数。

在计算因子和的过程中,我们需要注意如下几点:

  1. 因子包括了 1 和数本身,所以当数字为 1 或 0 时,我们就可以跳过这个数字的处理。
  2. 在累加所有因子之和时,可以将每个找到的因子以及它的“伴侣”一起加入总和。例如,若因子为 2 和 8,则在计算总和时应该同时加上 2 和 8。这样做可以避免重复计算。
  3. 如果某个数字有因子 a 和 b(a!=b),且它们的乘积(a*b=n)等于该数字,那么我们说 a 和 b 是一个“互异因子对”。当计算所有因子时,只需考虑因子小于等于数字平方根的部分,因为大于平方根部分的因子都可以由小于平方根的因子算出来。

具体地,可以使用两个循环来求解。外层循环遍历区间中的每个数字,内层循环计算该数字的所有因子之和。最后,将所有符合条件的完美数存储在一个数组中,并按顺序输出,输出时注意最后一个数后面没有空格,只有前面的数后面有空,因此这里需要讨论输出的数是否为空格。如果没有找到任何完美数,就输出 None。

代码:

#include<stdio.h>
#include<math.h>

int main()
{
    int n, m, sum = 0, i, j, ws[20], count = 0;
    scanf("%d%d", &n, &m);
    // 循环寻找每个数字,即区间 [n, m] 内的所有数 
    for (i = n; i <= m; i++) {
        // 先排除特殊情况:1 不是完美数 
        if(i == 1){
            continue;
        }
        // 计算当前数所有因子的和 
        sum = 0;
        for (j = 1; j <= sqrt(i); j++) { // 因子一定小于或等于sqrt(i) 
            if (i % j == 0) { // j 是 i 的因子 
                sum += j; // 累加 j 
                if(j != i / j && j != 1){ // 存在更小的因子
                    sum += i / j; // 累加 i/j 
                }
            }
        }
        // 如果因子之和等于当前数,则判定为完美数,并将其存储到数组中 
        if (sum == i) {
            ws[count] = sum;
            count++; // 计数器自增1,表示发现了一个新的完美数 
        }
    }
    // 输出结果 
    for (i = 0; i < count; i++) 
    {
        if (i == count - 1)
            printf("%d", ws[i]);
        else
            printf("%d ", ws[i]);
    }
    if (count == 0)
        printf("None");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
文件夹目录: 1.取所有质 2.求最小公倍 3.求最大公约 4.汉诺塔 5.9X9乘法表 6.猫捉老鼠(筛选法) 7.水仙花问题 8.计算组合 9.身份证升级15位升级到18位 10.用冒泡法排序字 11.九宫计算 12.奶牛问题 13.求阶乘 14.折半查找 15.给歌手打分 16.航线设置 17.字全排列 18.借书方案 19.求直角三角形 20.二分排序 21.抢30 22.求回文 23.斐波那契列(递推法) 24.分块查找 25.求帕斯卡三角(杨辉三角) 26.箱子问题(贪婪法) 27.寻找文件(递归法) 28.求最大公约(递归法) 29.取不重复(排除法) 30.拉丁方 31.波松瓦分酒 32.皇后问题 33.背包问题 34.角谷猜想 35.邮票组合 36.贮油点 37.分解质因 38.任意进制转换(大) 39.计算星期几(常用公式) 40.计算星期几(蔡勒公式) 41.猴子吃桃子 42.马踏棋盘 43.打鱼还是晒网 44.九位累进可除 45.十进制转为二进制 46.九连环 47.找窃贼 48.哥德巴赫猜想 49.最小生成 50.农夫过河 51.旅游最省钱路径 52.马克思手稿中的学题 53.上楼梯(递归).e 54.上楼梯(非递归) 55.金额大小写转换 56.求一元二次方程的根(二分法) 57.字与IP地址间的转换 58.八皇后问题(回溯法) 59.求N阶幻方 60.计算分的精确值 61.找零钱 62.求一元二次方程的根(公式法) 63.比赛日程(分治法) 64.两个有序组的合并 65.统计投色子(2个)的结果 66.12小球问题 67.改进冒泡排序法 68.螺旋组 69.射击环 70.猜字游戏 71.桶排序 72.造币厂问题 73.直接插入排序 74.搬砖 75.公车座位巧安排 76.韩信点兵(中国剩余定理) 77.黑洞 78.矩阵相乘 79.螺旋矩阵问题(多循环法) 80.买水果问题 81.求平方根 82.求任意三角形面积 83.全排列问题(递推法) 84.怎样组合值最大 85.取两之间均匀分布的随机 算法: 递归 递推法 分块查找 筛选法 枚举法 冒泡法 二分法 贪婪法 本程序要易语言4.0以上版本才可以运行 易语言 V5.1 完美破解版下载地址: http://xiazai.xiazaiba.com/Soft/E/e_V5.1_XiaZaiBa.exe 应用平台: Win7 / Vista / Win2003 / WinXP / Win2000 软件大小: 102.25 MB
目录 第1 章重构,第一个案例···· · ·· · · ····· · · ····· ··· · ····· · · ·….... ……................ ….............. …..... …...... …l I.I 起点···· ········· · · · ·· · ············· · ··· · ··········· ·· · ··· · ··········· · · ··· · · ··· ···· ·· ····· · ·· ···· · ·· · · ··· ·· · · · ·· ·· · ·· · ···· · ··· ·····I 1.2 重构的第一步·· ·· · ·· ········· ···· ·· · ······· ········· · ········· · ··· · ······ ··· ·· · · ·· · ·· · · · · ··· ··· ·· ·· · ·· · ········ ·· · ············ .7 1.3 分解并重组s t atement ()…............. …······································ ….......... …................. 8 1.4 运用多态取代与价格相关的条件逻辑………… … . . ..……....... ….... ….... …······ ……····· …··34 1.5 结语··· ······· ··· ·· · ······ · ··· · ········ ···· · ·· ····· · · ·· ·· · ···· ·· · ·· ·· ·· · ·· · ·· · · ··· · ·· · ·· · · ·· · ·· · ·· ·· ·· ····· ·· · ·· ·· ····· · ···· · ·····52 第2 章重构原则······ · ···· ······· ·· · · ·· ··· ·· · · ··· · · · · ·· · ·· ·· ·· · ···· ·· · ·· ·· ·· · ·· · ·· ···· ········ ·· ···· · ·················· · ·· · · ·······53 2.1 何谓重构·· · · ·· ··· ·· ··· ··· ····· · ············· · ·· ················ · ·· ·· ······················· · ············· · ······· ·· • ··· ····· ·· ·53 2.2 为何重构···· ········· ··· · ············ · ·· ···· · ···· ·· · ·· · · ·· · · ··· ····· · · ·· ····· • ···· • · ·············· · · · ·· ··· ···· ····· · ········ ···55 2.3 何时重构··· ··· ·· · ·· ··· · ·· ·· ··· ·· ··· ·· ·· ·· ··· • · ·· ····· ·· · ·· •· ······· · · ····· ·· · ·· ·· · ···· ·· ················· · ············· · ·· · ····57 2.4 怎么对经理说·· ·· ····· · ··· · ···· · ········· ···· · ···· ············ ········· ·· ··· ·· ··· ·· ·· ·· ··· ·· •· ·· · ···· ······· · · ·········· ····60 2.5 重构的难题...... .. . ............. .. ....... . .... . ........... .. . . . ...... .. ... ... .............................. . ........ . ........ 62 2.6 重构与设计······ ·· · · ······· ·· ···· · ··· ·· · · ··· ·· ·· ····· · · · ·· ·· ·· ··· ·· ·· · ·· ·· ···· · ···· · · ········ ···· · ·· · · ·· · ·· ·· --· ·· ·· · ·· · · ·· ··66 2.7 重构与

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾乃宇宙欠债王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值