完数寻找
要求
请写一个程序,给出指定整数范围[a,b]内的所有完数,0 < a < b < 10000。
一个数如果恰好等于除它本身外的所有因子之和,这个数就称为"完数"。
例如6是完数,因为6=1+2+3
输入说明
输入为两个整数a和b,a和b之间用空格分隔
输出说明
输出[a,b]内的所有完数,每个数字占一行
输入样例
1 10
输出样例
6
int per_num(int x)
{
if(x==1)
return 0;//单独讨论1
else
{
int data[10000];//数组不允许一个变化的大小
int count=0;
int sum=0;
for(int j=0;j<x;j++)
{
data[j]=0;//将前x项数初始化为0
}
for(int i=1;i<x;i++)
{
if(x%i==0)//进行约数的判断
{
data[count]=i;
count++;//将约数赋给数组data
}
}
for(int j=0;j<x;j++)
{
sum=data[j]+sum;//将数组中的前x项相加
}
if(sum==x)
return x;//若是合数,返回本身
else
return 0;
}
}
int main()
{
int a,b;
int count1=0;
int j=0;
scanf("%d %d",&a,&b);
if(0<a&&a<b&&b<10000)
{
for(int i=a;i<=b;i++)
{
if(per_num(i)==i)
count1++;//记录出现的合数的数量
}
int num[10000];//存储合数的数组
for(int i=a;i<=b;i++)
{
if(per_num(i)==i)
{
num[j]=i;//将合数赋值给num
j++;
}
}
for(int j=0;j<count1;j++)//count1所记录下的合数的数目决定了循环的次数,注意count不取等号
{
printf("%d",num[j]);
printf("\n");//逐行打印
}
}
return(0);
}//不难发现数组data与num中的垃圾值对结果没有影响,因为通过计数器我们控制了数组赋值与数组打印的次数,从而防止了数组中垃圾值的影响
思路:1:创建一个函数用于判断是否为合数,若为合数返回本身,否则返回0,这个函数完成两个功能,存储约数并且将约数相加
2:主体部分第一个循环判断合数的数量,第二个循环检索合数并将其存在数组中
3:最后用count变量记录下的合数数目作为最后一次循环循环的次数,并将合数逐行打印