黑马程序员技术交流社区

标题: 找出完数 [打印本页]

作者: 吃饭工作睡觉    时间: 2015-11-3 08:29
标题: 找出完数
题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=123.编程     找出10000以内的所有完数。
请给出详细的程序说明,谢谢指导!


作者: poxiao    时间: 2015-11-3 08:29
吃饭工作睡觉 发表于 2015-11-8 20:59
也不是特别完美,和别人告诉我的答案不太一样。

额、、、你可以在循环判断的时候只判断到factor <= sqrt(num),这样可以减少很多判断次数,别人告诉你的思路是什么,分享下?
作者: xingjiyuan26    时间: 2015-11-3 11:47
要先知道因子的概念
  1. //题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程     找出10000以内的所有完数。  
  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 //穷举
  5.                 for (int i = 1; i < 10000; i++) {
  6.                         int sum = 0;
  7.                         //同样用穷举找到一个数的所有因子。
  8.                         for (int j = 1; j <= i / 2; j++) {
  9.                                 //一个数的因子就是可用这个数除尽的数
  10.                                 if (i % j == 0) {
  11.                                         //使用变量累加所有的因子
  12.                                         sum+=j;
  13.                                 }
  14.                         }
  15.                         //如果所有的因子累加结果与这个数相等,则是完数
  16.                         if (sum == i)
  17.                                 System.out.print(sum + " ");
  18.                 }
  19.         }
  20. }
复制代码

作者: 打滚的橘子    时间: 2015-11-3 18:52
xingjiyuan26 发表于 2015-11-3 11:47
要先知道因子的概念

虽然结果来说应该没错,但总感觉第二个for循环那里不严谨,要加个判断 i 是奇数还是偶数的if else语句,然后用j<=i/2或者j<=(i+1)/2 控制循环。
作者: 大自然的搬运工    时间: 2015-11-3 20:14
二楼 完美
作者: 菊花爆满山    时间: 2015-11-3 23:25
同意2楼 怎么都是C语言100题里面的
作者: 菊花爆满山    时间: 2015-11-3 23:27
打滚的橘子 发表于 2015-11-3 18:52
虽然结果来说应该没错,但总感觉第二个for循环那里不严谨,要加个判断 i 是奇数还是偶数的if else语句, ...

那里不严谨
作者: 秋色潇湘    时间: 2015-11-3 23:58
  1. /*
  2. 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.
  3. 找出10000以内的所有完数。
  4. */

  5. class DivisorProblem {
  6.         public static void main(String[] args) {
  7.                 StringBuffer strs = new StringBuffer(); //创建一个StringBuffer类存储找到的数字
  8.                 for (int i=1;i<=10000 ;i++ ) {          //遍历1-10000内的所有数
  9.                         int sum = 0;
  10.                         for (int j=1;j<i ;j++ ) {           //遍历小于i的所有的数,如果为因子,就加到sum值中
  11.                                 if(i%j==0) {         
  12.                                         sum +=j;
  13.                                 }
  14.                         }
  15.                         if (sum == i) {                     //最后如果所有因子的和与原数相等,就添加进StringBuffer
  16.                                 strs.append(i+" ");
  17.                         }
  18.                 }
  19.                 System.out.println(strs);   //输出结果,6 28 496 8128,我以为会输出一大片。。
  20.         }
  21. }
复制代码

作者: 铁苯锌    时间: 2015-11-4 19:32
这个题目跟水仙花数很相似啊
作者: liruixue    时间: 2015-11-5 09:34
本帖最后由 liruixue 于 2015-11-5 09:37 编辑

#include<stdio.h>void main(){
   int  sum=0;
    for(int i=1;i<1000;i++){
        for(int j=1;j<i;j++){
             if(i%j==0)
                 sum+=i;
               }
       if(sum==i)
          printf("%d\t".i);

         }
}

作者: poxiao    时间: 2015-11-7 12:04
  1. #include<stdio.h>
  2. #include<math.h>

  3. //获取一个整数是不是完数
  4. bool isPerfect(int num)
  5. {
  6.         int sum = 1, factor = 2;
  7.         for (factor; factor < num; ++factor)
  8.         {
  9.                 if (num % factor == 0)
  10.                         sum += factor;
  11.         }
  12.         if (sum == num)
  13.                 return true;
  14.         else
  15.                 return false;
  16.                
  17. }

  18. int main()
  19. {
  20.         int num = 6, count = 0;

  21.         //找出0-10000之间的所有的完数
  22.         for (num; num < 10000; ++num)
  23.         {
  24.                 if (isPerfect(num))
  25.                 {
  26.                         printf("%d is a perfect number.\n", num);
  27.                 }
  28.         }
  29.         return 0;
  30. }
复制代码

作者: wx_ao22R6RC    时间: 2015-11-8 11:32
大概思路就是这样,大同小异我的代码就不写了
作者: 吃饭工作睡觉    时间: 2015-11-8 20:59
poxiao 发表于 2015-11-7 12:04

也不是特别完美,和别人告诉我的答案不太一样。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2