PTA 7-134 列出完数
输入一个整数n,要求输出[1,n]范围内的所有完数。完数是一个正整数,该数恰好等于其所有不同真因子之和。例如,6、28是完数,因为6=1+2+3,28=1+2+4+7+14;而24不是完数,因为24≠1+2+3+4+6+8+12=36。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(1≤n≤10000)。
输出格式:
对于每组测试,首先输出n和一个冒号“:”;然后输出所有不大于n的完数(每个数据之前留一个空格);若[1,n]范围内不存在完数,则输出“NULL”。引号不必输出。具体输出格式参考输出样例。
输入样例:
100
5000
5
输出样例:
100: 6 28
5000: 6 28 496
5: NULL
出处:
ZJUTOJ 1190
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
代码:
#include <stdio.h>
int main()
{
int n, num = 0; // num表示完数数量
int arr[100]; // arr表示完数数组
for ( int i = 1; i <= 10000; i++ )
{
int temp = 0;
for ( int j = 1; j <= i / 2; j++ )
{
if ( i % j == 0)
{
temp = temp + j;
}
}
if ( temp == i)
{
arr[num] = temp;
num++;
}
}
while ( scanf( "%d", &n ) != EOF)//测试数据有多组,处理到文件尾
{
printf( "%d:", n );
for ( int i = 0; i < num; i++ )
{
if( arr[0] > n)//如果第一个完数就大于输入的数字则表示没有完数输出NULL
{
printf( " NULL" );
break;
}
else if( arr[i] <= n )//如果数组中第i个数小于等于输入的数则输出这个完数
{
printf( " %d", arr[i] );
}
else//如果遇到一个大于n的则表示后面没有完数在该范围内了,结束循环
{
break;
}
}
printf("\n");
}
return 0;
}
解题思路
列出完数的步骤:
step 1:输入一个整数n;
step 2:如果第一个完数就大于输入的数字则表示没有完数输出NULL;
step 3:如果数组中第i个数小于等于输入的数则输出这个完数;
step 4:如果遇到一个大于n的则表示后面没有完数在该范围内,结束循环;
step 5:输出所有不大于n的完数。
归属知识点
数组,选择结构,循环结构