PTA 7-76 寻找完美数*

PTA 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
代码:

#include <stdio.h>
int main(){
    int int_a, int_b;
    int i, j, sum = 0;    //sum为完美数真因子和
    int flag = 0;    //是否有完美数的标志
    int p = 0;    //记录完美数的次数
    scanf( "%d %d", &int_a, &int_b );
    for( i = int_a; i <= int_b; i++ ){//把int_a到int_b的数都判断一遍
        sum = 0;
        for( j = 1; j <= i/2 ; j++ ){//之所以除2是因为,一个数的真因子最大为该数的一半,如10的最大真因子为5,刚好一半,24的最大真因子为12刚好一半,不会超过这个数
            if( i % j == 0 )//如果是真因子就把真因子加起来
                sum += j;
        }
        if( sum == i && sum != 1 ){//如果真因子的和等于它自己本身并且和不等于1则输出它自己本身
            if( p == 0 )//如果是第一个完美数就不输出空格
                printf("%d", i );  //输出中间用空格分开,因此用if...else语句
            else
                printf(" %d", i );
            p = p + 1; //p记录输出第几个完美数
            flag = 1;//有完美数才会变成1
        }
    }
    if(flag == 0)
        printf("None\n");
    return 0;
}

解题思路:
step1:确定范围
step2:每个数从1开始做除法,如果是该被除数的真因子,则将其求和
step3:再判断真因子的和是否等于本身且不等于1则输出
step4:因为题目要求每个完美数之间用空格隔开,输出的时候,如果第一个是完美数则不用空格隔开,即用if…else语句条件输出结果
step5:用flag标志,如果有完美数则赋值1,没有完美数则等于初始值
step6:用if条件语句判断是否有完美数,如果没有则输出’None’(题目要求)

归属知识点:
双重for循环结构
if条件语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值