A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如果一个数恰好等于它的因子之和,则称该数为“完全数”[1]  。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。

整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。


以上概念来自百度。
通过以上概念,得知“算完数要先算出约数。”

代码如下,英语不好,有些变量懒得找翻译,直接用拼音代替。

  1. #include <stdio.h>
  2. /**
  3. *  算完数要先算出约数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
  4. *  如果一个数恰好等于它的因子之和,则称该数为“完全数”[1]  。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
  5. */
  6. int wanshu(int num);
  7. int main()
  8. {
  9.     int num = 1000;
  10.     int numOfWanshu = wanshu(num);
  11.     printf("%d以内总共有%d个完数\n",num,numOfWanshu);
  12.     return 0;
  13. }

  14. int wanshu(int num)
  15. {
  16.     //定义存储完数数量的变量
  17.     int numOfWanShu = 0;
  18.     for (int i = 1; i <= num; i++ ) {
  19.         
  20.         //定义存储约数数量的变量
  21.         int numOfYueShu = 0;
  22.         //计算约数数量
  23.         for (int j = 1; j < i; j++) {
  24.             if (i%j == 0) {
  25.                 numOfYueShu++;
  26.                 //测试
  27.                 //printf("%d的约数之%d是:%d\n",i,numOfYueShu,j);
  28.             }
  29.         }
  30.         //计算完数
  31.         //定义一个存储约数想家之和的变量
  32.         int temp = 0;
  33.         //定义一个存数约数相加次数的变量
  34.         int n = 0;
  35.         for (int j = 1; j < i; j++) {
  36.             if (i % j == 0) {
  37.                 temp += j;
  38.                 n++;
  39.                 if (temp == i && n == numOfYueShu) {
  40.                     numOfWanShu++;
  41.                     //测试
  42.                     printf("完数是%d\n",i);
  43.                     break;
  44.                 }else if(temp > i)
  45.                 {
  46.                     break;
  47.                 }
  48.             }
  49.         }
  50.         
  51.     }
  52.     return numOfWanShu;
  53. }
复制代码


结果为:
完数是6
完数是28
完数是496
1000以内总共有3个完数

1 个回复

倒序浏览
学习了,加油!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马