#include <stdio.h>
int main(void)
{
void PerfectNum(int a,int b);
int start,end;
printf("输入完数的取值范围:(逗号间隔)");
scanf("%d,%d",&start,&end);
PerfectNum(start,end);
printf("\n");
}
void PerfectNum(int a,int b)
{
int sum,i,j;
for(i = a; i<=b; i++)
{
sum = 0;
for(j = 1; j<i; j++)
{
if(i%j==0)
sum+=j;
}
if(sum==i)
printf("%d\n",i);
}
}
输入求取完数的范围,输出符合的完数。程序还有可以改进的地位
上一段程序循环是按照顺序遍历,显然效率不高,【对某一个整数来说,最大的因子为n/2(n是偶数),n是奇数的时候小于n/2】
所以在所以范围可以由原来的(1,i)缩小到(1,i/2) 参考上面代码。
修改代码片段:
void PerfectNum(int a,int b)
{
int sum,i,j;
for(i = a; i<=b; i++)
{
sum = 0;
for(j = 1; j<= i/2; j++)
{
if(i%j==0)
sum+=j;
}
if(sum==i)
printf("%d\n",i);
}