PTA chap4课后 L2-1 找完数(c语言)

软件14徐彬芳202321332101 软件23 2023-12-09 12:08:10

L2-1 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

作者:陈建海

单位:浙江大学

代码长度限制:16 KB

时间限制:400 ms

内存限制:64 MB

思路

1、根据题目要求,在有完数的可以将代码分为两部分,一部分用以判断并寻找完数,一部分用以寻找完数的因子并逐一输出。

2、判断完数时可以使用嵌套循环。

3、判断有无完数时可以使用中间变量,设定中间变量的值,寻找完数的循环完毕之后,再判断该值是否变化。

代码如下:

#include <stdio.h>
int main()
{
    int n,m,sum;
    scanf("%d %d",&m,&n);
    int a;
    int k=0;
    int i,j;
    for(i=m;i<=n;i++){
        sum=0;              //每次内部循环完毕,从0开始再寻找下一个完数 
        for(j=1;j<i;j++){    
            if(i%j==0){      
                sum=sum+j;   
            }
        }
        //以寻找因子为条件,各因子数相加的总和即为一个完数,但因子中不能包括自身
		 
        if(i==sum)         //遍历m到n中所有已知的完数 
        {
            printf("%d = 1",i);
            //首先输出1,确保格式正确 

            for(a=2;a<i;a++){
                if(i%a==0){
                    printf(" + %d",a); //输出后续因子 
                }
            }
            printf("\n");    //每个完数输出完毕后换行 
            k++;
        }
    }
    if(k==0){
        printf("None\n");
    }
    //以k的数值变化来判断有无完数 
    return 0;
}

代码运行结果:

问题总结:

 1、输出因子时需排除自身。

 2、注意开头输出1时与后续输出因子时格式的区分。

 

...全文
273 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

212

社区成员

发帖
与我相关
我的任务
社区描述
程序设计基础课程教学群
c语言c++ 高校 福建省·厦门市
社区管理员
  • xmzq001
  • 鹿饮涧鸣
  • jiangxiaoju
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

请加入学习社区的软件23级同学修改社区昵称为学号+姓名,以便登记作业提交情况。

试试用AI创作助手写篇文章吧