所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
输入格式:
输入在一行中给出2个正整数m和n(0<m<=n<=10000),中间以空格分隔。
输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。
输入样例:
1 30
输出样例:
1 = 1 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14
程序:
#include #include int main(void) { int m, n, i, j, k, sum, temp; int a[10]; scanf("%d%d", &m, &n); for(i = m; i <= n; ++i) { sum = 1; for(j = 2; j <= sqrt(i); ++j) { /* 求因子和 */ if(i % j == 0) { sum += j; temp = i / j; if(temp > j && temp < i) sum += temp; } } if(sum == i) { /* 完数 */ k = 0; a[k++] = 1; for(j = 2; j <= i / 2; ++j) { /* 求完数因子并保存在数组中 */ f(i % j == 0) a[k++] = j; } printf("%d = ", i); /* 输出 */ for(j = 0; j < k - 1; ++j) printf("%d + ", a[j]); printf("%d\n", a[k - 1]); } } return 0; }