题解 | #完全数计算#

完全数计算

http://www.nowcoder.com/practice/7299c12e6abb437c87ad3e712383ff84

//方法二
/*
* 我们只需要从1开始把所有可以整除n的约数全部加起来即可
* 约数就是能够被数字整除,而这里简化的一个思路是数字能够被整除,则除数和结果就都是约数,这种思路下,只需
  要从1计算到平方根即可,为何是平方根看下面即可
  比如:数字 8 , 能够整除 2 ,结果是 4 ,则除数 2 和结果 4 都是约数,而这两个只需要一次计算判断即可。
需要注意的是 4,9,25... 这种,除数和结果相同的情况,则除数或者结果只相加一次就够了
*/
#include<stdio.h>
#include<math.h>
int find(int n)
{
    int sum = 1;                  //因为i从2开始把1跳过了,所以sum等于1加回来
    int i = 0;

    //这里为何可以开平方根呢? sqrt(n)
    //因为n被1到n-1之间任一整数整除时,两个因子有一个必定小于或等于 根号n
    //                                 另一个大于或等于根号n
    //例如16能被2,4,8整除,16=2*8,2小于4,8大于4,因此只需要判定1到根号n有无因子即可

    for (i = 2; i <= sqrt(n); i++) //这里i没有等于1是因为题目说除了自身以外的约数
    {
        if (n % i == 0)  //是否为约数
        {
            sum += i;
            int m = n / i;
            if (i!=sqrt(n)) //例如9=3x3,这是防止重复的数加进来
            {
                sum += m;
            }
        }
    }
    if (sum == n)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        int i = 0;
        int count = 0;   //计数
        for (i = 2; i <= n; i++)//对n以内的数字都进行判断是否是完全数,注意1不参与判断
        {                       //原因是上面sum初始化成1了,如果i等于1的话85行代码sum==n
            int pan = find(i);  //会多返回一次
            if (pan)
            {
                count++;
            }
        }
        printf("%d\n", count);
    }
    return 0;
}
全部评论

相关推荐

04-06 11:24
已编辑
太原学院 C++
真烦好烦真烦:感觉不太对劲,这种主动加微信的一般都是坑,要小心辨别
点赞 评论 收藏
分享
04-08 10:36
已编辑
华南理工大学 C++
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务