C语言 完数难题

题目描述

小明正在进行期末数学考试,现在他遇到了这样一个题:如果一个大于 1 的正整数的所有因子之和等于它的本身,则称这个数是完数,比如 628 都是完数:6=1+2+328=1+2+4+7+14。请判断两个正整数之间完数的个数。小明想请聪明的你帮帮他。

输入输出格式

输入格式

输入包含两个正整数 n1n2 ,表示题目描述中的数据范围。 正整数之间以空格间隔。

输出格式

针对输入,请打印出 n1n2 之间(包括边界)存在的完数个数。

输入输出
样例1

输入  2 5

输出  0

样例2

输入  5 7

输出  1

说明提示

1<n1,n2<10000

代码:

#include<stdio.h>
int main(){
    int n1,n2,s,count=0,m,i;  //s表示所有因子之和,count表示所求完数的个数
    scanf("%d%d",&n1,&n2);
    for(i=n1;i<=n2;i++)  //外层循环就是让程序遍历 输入的两数之间的数
    {
        s=0;  //内层循环就是从1开始遍历看外层循环进来的数是否为完数
        for(m=1;m<=i/2;m++)  
        {
            if(i%m==0)  //能除尽说明m是这个数(即此时的i)的因子
            s=s+m;  //因子相加
        }
        if(s==i) //因子相加和等于这个数本身 这数为完数,count加1
        count++;
    }
    printf("%d",count);
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值