整数6的因子包括1、2和3,巧合的是6=1+2+3,像6这样所有因子之和恰好等于自身的数称为“完数”。
编写程序找出m至n之间的所有完数。
请在这里写输入格式。例如:输入两个正整数m 、n,要求 m <= n <=10000。
请在这里描述输出格式。例如:输出符合条件的完数,各数之间使用空格隔开。
在这里给出一组输入。例如:
10 100
在这里给出相应的输出。例如:
28 = 1 + 2 + 4 + 7 + 14
#include<iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int count=1;
int shit[n];
int tag=0;
for(int i=m;i<=n;i++){
for(int k=2;k<=i/2;k++){
if(i%k==0){
count+=k;
shit[tag]=k;
tag++;
}
}
if(count==i){
cout<<i<<" = 1";
for(int j=0;j<tag;j++){
cout<<" + "<<shit[j];
}
cout<<endl;
}
tag=0;
shit[n]={0};
count=1;
}
}
数据结构:
定义两个整数变量m和n,用来存储输入的范围。
定义一个整数变量count,用来记录一个数的真因子之和。初始值为1,因为1是任何数的真因子。
定义一个整数数组shit,用来存储一个数的真因子。
定义一个整数变量tag,用来地位数组的位置,初始值为0。
实现过程:
用一个for循环,从m遍历到n,每次循环的变量i表示要判断是否为完数的数。
用另一个for循环,从2遍历到i/2,每次循环的变量k表示要判断是否为i的真因子的数。因为一个数的真因子不会超过它的一半,所以只需遍历到i/2即可。
如果i能被k整除,说明k是i的真因子,那么就把k加到count上,同时把k存入数组shit中,并把tag加1。
当内层循环结束后,判断count是否等于i,如果是,说明i是一个完数,那么就用cout输出i和它的真因子之和的等式。用一个for循环,从数组shit中取出真因子,并用加号连接。
当外层循环结束后,程序就完成了找出所有完数的任务。