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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吃饭工作睡觉 中级黑马   /  2015-11-3 08:29  /  3395 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=123.编程     找出10000以内的所有完数。
请给出详细的程序说明,谢谢指导!

最佳答案

查看完整内容

额、、、你可以在循环判断的时候只判断到factor

15 个回复

倒序浏览
吃饭工作睡觉 发表于 2015-11-8 20:59
也不是特别完美,和别人告诉我的答案不太一样。

额、、、你可以在循环判断的时候只判断到factor <= sqrt(num),这样可以减少很多判断次数,别人告诉你的思路是什么,分享下?
回复 使用道具 举报
要先知道因子的概念
  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. }
复制代码
回复 使用道具 举报
xingjiyuan26 发表于 2015-11-3 11:47
要先知道因子的概念

虽然结果来说应该没错,但总感觉第二个for循环那里不严谨,要加个判断 i 是奇数还是偶数的if else语句,然后用j<=i/2或者j<=(i+1)/2 控制循环。

点评

离完美更进一步了!谢谢!  发表于 2015-11-5 09:13
回复 使用道具 举报
二楼 完美
回复 使用道具 举报
同意2楼 怎么都是C语言100题里面的

点评

被发现了,不好意思!  发表于 2015-11-5 09:16
回复 使用道具 举报
打滚的橘子 发表于 2015-11-3 18:52
虽然结果来说应该没错,但总感觉第二个for循环那里不严谨,要加个判断 i 是奇数还是偶数的if else语句, ...

那里不严谨
回复 使用道具 举报
  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-5 09:19
回复 使用道具 举报
这个题目跟水仙花数很相似啊
回复 使用道具 举报
本帖最后由 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);

         }
}
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
大概思路就是这样,大同小异我的代码就不写了
回复 使用道具 举报

也不是特别完美,和别人告诉我的答案不太一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马