如果一个数恰好等于它的因子之和,则称该数为“完全数”[1] 。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
以上概念来自百度。
通过以上概念,得知“算完数要先算出约数。”
代码如下,英语不好,有些变量懒得找翻译,直接用拼音代替。
- #include <stdio.h>
- /**
- * 算完数要先算出约数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
- * 如果一个数恰好等于它的因子之和,则称该数为“完全数”[1] 。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
- */
- int wanshu(int num);
- int main()
- {
- int num = 1000;
- int numOfWanshu = wanshu(num);
- printf("%d以内总共有%d个完数\n",num,numOfWanshu);
- return 0;
- }
- int wanshu(int num)
- {
- //定义存储完数数量的变量
- int numOfWanShu = 0;
- for (int i = 1; i <= num; i++ ) {
-
- //定义存储约数数量的变量
- int numOfYueShu = 0;
- //计算约数数量
- for (int j = 1; j < i; j++) {
- if (i%j == 0) {
- numOfYueShu++;
- //测试
- //printf("%d的约数之%d是:%d\n",i,numOfYueShu,j);
- }
- }
- //计算完数
- //定义一个存储约数想家之和的变量
- int temp = 0;
- //定义一个存数约数相加次数的变量
- int n = 0;
- for (int j = 1; j < i; j++) {
- if (i % j == 0) {
- temp += j;
- n++;
- if (temp == i && n == numOfYueShu) {
- numOfWanShu++;
- //测试
- printf("完数是%d\n",i);
- break;
- }else if(temp > i)
- {
- break;
- }
- }
- }
-
- }
- return numOfWanShu;
- }
复制代码
结果是:完数是6
完数是28
完数是496
1000以内总共有3个完数
localhost:~ jiangu$ |