| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖
标题:关于列出完数的优化探讨!
只看楼主 加入收藏
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
关于列出完数的优化探讨!
列出完数
Time Limit: 1 Second(s)    Memory Limit: 32 MB
Total Submission(s): 471    Accepted Submission(s): 147
Problem Description 自然数中,完数寥若晨星,请在从1到某个整数范围中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和。例如,6是完数,因为6=1+2+3。而24不是完数,因为24≠1+2+3+4+6+8+12=36。
Input输入数据中含有一些整数n(1<n<10000)。
Output对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格开道的一个个完数,每个n的完数列表应占独立的一行。若不存在完数,则输出" NULL"
Sample Input
100
5000
5
Sample Output
100: 6 28
5000: 6 28 496
5: NULL
在下不才,写了一个关于完数的程序,但是感觉这个程序算法的复杂度较高,想和大家探讨下,有没有更高效的算法。谢谢!
  #include<stdio.h>
 int method(int x)
{
   int i,s=0;
   for(i=1;i<=x/2;i++)
   {  if(x%i==0)
       {
        s=s+i;
       }
   }
   if(s==x)
      return x;
   else
      return 0;
  
}

  int main()
{
   int n,i,s,a[6],j,h;
   while (scanf("%d",&n)!=EOF)
   {
       j=1;
   for(i=2;i<=n;i++)
   {   
       s=method(i);
       if(s!=0)
       {
          a[j]=s;
          j++;
       }   
     
   }
    if(j==1)
       printf("%d: %s",n,"NULL");
    else
    {
          printf("%d: ",n);
          for(h=1;h<j-1;h++)
          {  
             printf("%d ",a[h]);
          }
             printf("%d",a[j-1]);
   
    }
   }
return 0;
}




搜索更多相关主题的帖子: Memory 自然数 
2011-06-08 22:29
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
大概看了一下,楼主是对每一个输入的 n 都要进行检测吧?
其实你只需要一次性把所有满足 1 < n < 10000 的完数都找出来放到一个数组里
然后每读一个 n 就输出一下不大于 n 的所有完数就好了啊。应该比你这样做快很多
2011-06-08 22:35
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:10 
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main() {
    short i, j, l = 0, p[10] = {0}; 
    int * a = (int *) malloc(sizeof(int) * 10000);    // a 用来存放 2 ~ 9999 各数字的因子的和
    memset(a, 0, sizeof(int) * 10000);                // 将 a 的各元素置为 0
    for (i = 1; i < 10000; i++) {                     // 计算 2 ~ 9999 各数字的因子和
        for (j = i + i; j < 10000; j += i) {
            a[j] += i;
        }
    }
    for (i = 2; i < 10000; i++) {                      // 逐个检测 2~9999 各数字
        if (a[i] == i) {                               // 如果数字 i 的因子和与它本身相等,即 i 为完数
            p[l++] = i;                                // 将 i 存入数组 p
        }
    }
    free(a);
    a = NULL;
    while (scanf(" %hd", &j)) {                        // 读取数字 j。%hd 表示短整型
        printf("%d:", j);
        if (j < p[0]) {
            printf(" NULL");
        } else {
            for (i = 0; i < l && p[i] <= j; i++) {      // 输出所有不大于读入的数字 j 的完数
                printf(" %d", p[i]);
            }
        }
        printf("\n");
        fflush(stdout);
    }
    return 0;
}


这个算法的效率还是比较高的。
不过,话说 10000 以下只有 4 个完数,所以,可以直接这样作弊 short p[4] = {6, 28, 496, 8128}。
嘿嘿,真正的极限性能~~

[ 本帖最后由 voidx 于 2011-6-9 01:46 编辑 ]
2011-06-09 01:43
哎呀东东
Rank: 1
等 级:新手上路
帖 子:10
专家分:1
注 册:2011-6-7
收藏
得分:0 
完数记得以前我们做过...就是循环什么的,还比较简单的
2011-06-09 02:14
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
收藏
得分:0 
回复 3楼 voidx
学习了。多谢了!
2011-06-09 12:04
快速回复:关于列出完数的优化探讨!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025885 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved