C 练习实例19
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数",例如 6=1+2+3 ,请编程找出 1000 以内的所有完数。
程序分析:请参照:C 练习实例14。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include <stdio.h>
int main() {
int i, j, sum;
printf("1000以内的完数有:\n");
for (i = 1; i <= 1000; i++) {
sum = 0; // 每次循环前重置sum
// 找出i的所有真因子并求和
for (j = 1; j < i; j++) {
if (i % j == 0) {
sum += j;
}
}
// 如果和等于i本身,则是完数
if (sum == i) {
printf("%d = 1", i); // 所有完数都包含1
// 打印其他因子
for (j = 2; j < i; j++) {
if (i % j == 0) {
printf(" + %d", j);
}
}
printf("\n");
}
}
return 0;
}
以上实例输出结果为:
6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
C 语言经典100例
Andy
and***ayne@foxmail.com
参考代码:
#include <stdio.h> #define MAXNUMBER 1000 int main() { int sum, x, i; for(x = 1; x <= MAXNUMBER; x++){ sum = 0; for(i = 1; i <= x/2; i++) if(x%i == 0) sum += i; if(sum == x) printf("%d\n", x); } return 0; }Andy
and***ayne@foxmail.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> int Perfect(int n); int main(void) { int i,j,count; for(i = 1; i <= 1000; i++) { if(Perfect(i)) { count = 1; printf("%d=",i); for(j = 1; j < i; j++) { if(i % j == 0 && count == 1) { printf("%d",j); count++; } else if(i % j == 0 && count != 1) { printf("+%d",j); count++; } } printf("\n"); } } return 0; } int Perfect(int n) { int sum = 0; for(int i = 1; i < n; i++) { if(n%i == 0) sum += i; } if(n == sum) return 1; else return 0; }HIT_CCC
117***2963@qq.com
win
l.z***16@qq.com
参考答案中的迭代次数利用了以下结论:假设有一个正整数N,对于 N/2 < a < N,a 不可能是 n 的因子。因为可以推导出 1<N/a<2,所以迭代范围缩小为 i<=N/2。
可以对以上情形进行推广,假设有一个正整数N,N 的所有因子为 a0 a1 ... an,且 a0<a1<...<an,则有以下结论:若 a1 为 N 的因子,则 N/a1 也是 n 的因子,且 N=a0*an=a1*an-1=...。对于 an-1<i<an,i 不可能是 N 的因子;因为可以推导出 a0=N/an<N/i<N/an-1=a1,a0 和 a1 范围内不存在N的因子。所以在确定了 a 是 N 的因子之后,则可以确定 N 的另一个因子 N/a,且迭代范围可以缩小为i<N/a。
#include <stdio.h> int perfect(int n) { int s=1, t=n, i; for(i=2; i<t; i++) { if(n % i == 0) { t = n / i; s += i; if(t != i) s += t; } } if(n==s) return 1; else return 0; } int main() { int i, j, t; for(i=1; i<1001; i++) { if(perfect(i)) { printf("%d=1", i); t = i; for(j=2; j<t; j++) { if(i % j == 0) { t = i / j; printf("+%d+%d", j, t); } } printf("\n"); } } }win
l.z***16@qq.com