| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 16175 人关注过本帖
标题:求一完数算法
只看楼主 加入收藏
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
 问题点数:0 回复次数:13 
求一完数算法
一个数如果等于他的因子之和,就称这个数为“完数",例如6,6=1+2+3,现求实现1000之内的所有完数,输出格式为:6 its factors are 1,2,3
搜索更多相关主题的帖子: 数算 
2008-11-05 13:30
shmilytong
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2008-10-31
收藏
得分:0 
int main()
{
int i,j,sum;
for(i=2;i<=1000;i++)
{
sum=0;
for(j=1;j<i;j++)
{
if(i%j==0)
{
sum+=j;
}
}
if(sum==i)
printf("It's a Perfect n:%d\n",i);
}
getchar();
getchar();
return 0;
}
这里只把思路给你,我觉得按照你的要求给完整答案对你学语言不好,这道题目是挺经典的一道C语言程序设计题,楼主最好多动脑动手想一想
2008-11-05 13:44
gzbao9999
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:0
注 册:2008-11-5
收藏
得分:0 
#include<stdio.h>


int iswanshu(int n)
{
    int i,sum ;
    sum=0 ;
    for(i=1;i<n;i++)
    {
        if(n%i==0)
        sum=sum+i ;
    }
    if(sum==n){
        return 1 ;
    }else{
        return 0 ;
    }
}
printwanshu(int n)
{
    int i ;
    printf("%d its factors are ",n);
    for(i=1;i<n;i++)
    {
        if(n%i==0)
        printf("%d,",i);
    }
    printf("\n");
}

main()
{
    int i,n ;
    while(1)
    {
        printf("本程序将实现输出1-n之间的完数,n>=1\n现在请输入n:");
        scanf("%d",&n);
        printf("你输入的数是%d\n",n);
        if(n>=1)
        break ;
    }
    for(i=1;i<=n;i++)
    {
        if(iswanshu(i)==1)
        printwanshu(i);
    }
}
2008-11-05 14:08
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
得分:0 
谢谢楼上的,程序我编译过了,但是输出不对,我不会的地方就是不知道怎么在一行输出“完数”的因子
2008-11-05 14:10
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
得分:0 
谢谢gzbao999,也感谢2楼的,谢谢了
2008-11-05 14:17
wanjiang
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2008-10-25
收藏
得分:0 
#include <stdio.h>
const int M = 1000;
int   main()
{
    int k[11];
    int i, a, n, s;
    for (a = 2; a <= M; a++)
    {
        n = 0;
        s = a;
        for (i = 1; i < a; i++)
            if (a % i == 0)
            {
                n++;
                s = s - i;
                k[n] = i;
            }
        if (s == 0)
        {
            printf("%d Its factors are ", a);
            for (i = 1; i < n; i++)
                printf("%d,", k[i]);
            printf("%d\n", k[n]);
        }
    }
    return 0;
}
2008-11-05 14:34
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
得分:0 
谢谢楼上,原来我也想着用数据存贮,可是还没有学到数组,一直想用for循环嵌套实现,可以弄过来弄过去,倒是把自己给绕进去了,大家有QQ么,可以加个么我的308330622,交个朋友
2008-11-05 15:14
gzbao9999
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:0
注 册:2008-11-5
收藏
得分:0 
我重新换了一种算法
这种方法 大概能在16秒左右把40000000之内的 完数扫描出来

#include<stdio.h>


int iswanshu(int n)
{
    int i,j,count ;
    i=count=0 ;
    j=n ;
    while(i!=1)
    {
        i=n/2 ;
        if(n%2!=0)
        i++;
        if(j%i!=0)
        {
            return 0 ;
        }
        if((i%2)!=0&&i>1)
        count++;
        n=i ;
    }
    if(count>0)
    {
        return 1;
    }else{
        return 0;
    }
}

int checkagain(int n)
{
    int i,sum ;
    sum=0 ;
    for(i=1;i<n;i++)
    {
        if(n%i==0)
        sum=sum+i ;
    }
    if(sum==n){
        return 1 ;
    }else{
        return 0 ;
    }
}

printwanshu(int n)
{
    int i ;
    i=0 ;
    printf("%d its factors are ",n);
    while(i!=1)
    {
        i=n/2 ;
        if(n%2!=0)
        i++;
        printf("%d,",i);
        n=i ;
    }
    printf("\n");
}

main()
{
    int i,n ;
    while(1)
    {
        printf("本程序将实现输出1-n之间的完数,n>=1\n现在请输入n:");
        scanf("%d",&n);
        printf("你输入的数是%d\n",n);
        if(n>=1)
        break ;
    }
    for(i=1;i<=n;i++)
    {
        if(iswanshu(i)==1&&checkagain(i)==1)
        printwanshu(i);
    }
}

-----------------------------
我输入n=40000000时 大概16左右出了结果如下
6 its factors are 3,2,1,
28 its factors are 14,7,4,2,1,
496 its factors are 248,124,62,31,16,8,4,2,1,
8128 its factors are 4064,2032,1016,508,254,127,64,32,16,8,4,2,1,
33550336 its factors are 16775168,8387584,4193792,2096896,1048448,524224,262112,
131056,65528,32764,16382,8191,4096,2048,1024,512,256,128,64,32,16,8,4,2,1,

[[it] 本帖最后由 gzbao9999 于 2008-11-5 15:18 编辑 [/it]]
2008-11-05 15:14
whytk
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-11-5
收藏
得分:0 
#include "stdio.h"
main()
{
    int i=0;
    long sum=0;
    long data=0;    
    long num[100];
    int j=0;
    for(data=6;data<40000000;data++)
    {
        for(i=1;i<data;i++)
        {
            if(data%i==0)
               sum+=i;
        
        }
        if(data==sum)
        {
            
            for(i=1;i<data;i++)
            {
            if(data%i==0)
               num[j++]=i;
            }
            printf("  data:%d",data);
            for(i=0;i<j;i++)
              printf("  %d",num[i]);

            }
         sum=0;j=0;
        }
        

    }
2008-11-05 16:07
danielxu
Rank: 1
等 级:新手上路
帖 子:75
专家分:0
注 册:2008-10-30
收藏
得分:0 
学习了,Q个好么gzbao9999
2008-11-05 16:12
快速回复:求一完数算法
数据加载中...
 
   



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

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