24小时热门版块排行榜    

查看: 2572  |  回复: 16
本帖产生 4 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第廿三题: 已有5人参与

完美数是指一个数的所有因子的和还是这个数。比如28=1+2+4+7+14.
如果所有因子的和小于这个数,就称它为“贫数”。反之,如果所有因子的和大于这个数,则称之为“富数”。

比如12是最小的“富数”,因为 1+2+3+4+6=16>12. 最小的可以写为两个“富数”的和的数是24. 由数学分析可知,任何大于28123的整数都可以写成一个两个“富数”的和。但是,这个上限不能继续缩小了,显然已经知道最大的不能写成两个“富数”的和的数要比这个数小。

那么,所有不能写成两个“富数”的和的正整数的和是多少呢?

[ Last edited by holmescn on 2011-6-5 at 23:34 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 多谢交流 2011-06-06 14:43:16
微尘、梦想(程序强帖+1): 鼓励多交流! 2011-06-06 20:17:26
c 语言版本
先计算出小于28123的所有abundant number,然后再组合出所有可分解成两个富数的整数,最后再求和
用 time ./euler23的运行结果
CODE:
4179871

real        0m0.137s
user        0m0.132s
sys        0m0.000s

代码
CODE:
#include
#include
#include


int sumdivisors(int n){
        int i,sum=1,sqrtn=sqrt(n);
        for(i=2;i                 if(n%i==0)sum+=i+n/i;
        }
        if(sqrtn*sqrtn==n)sum-=sqrtn;
        return sum;
}

long euler23(int n){
        int i,j,tmp,abn_index=0;
        int abn[n];
        for(i=12;i                 if(sumdivisors(i)>i)abn[abn_index++]=i;
        }
  
        int num[n];
        memset(num,0,sizeof(num));
        for(i=0;i                 for(j=i;j                         tmp=abn[i]+abn[j];
                        if(tmp                         else break;
                }
        }

        long sum=0;
        for(i=1;i                 if(num[i]==0){
                        sum+=i;
                }
        }
        return sum;
}


int main(void){

        printf("%ld\n",euler23(28123));

        return 0;
}

[ Last edited by wangww2011 on 2011-6-6 at 11:45 ]
6楼2011-06-06 11:14:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 17 个回答

holmescn

金虫 (正式写手)


dubo(金币+1): 多谢交流 2011-06-06 14:41:22
微尘、梦想(程序强帖+1): 鼓励多交流! 2011-06-06 20:16:22
修改版1
CODE:
# -*- coding: utf-8 -*-

from math import sqrt
from timeit import timeit

def abundantGen():
    "生成一个富数列表"
    abundant = []
    n = 12

    while n < 28123:
        factors = [1]
        sqrtn = int(sqrt(n))
        for i in range(2,sqrtn+1):
            if n % i == 0:
                factors.append(i)
                if n / i != i:
                    factors.append(n/i)

        if sqrtn*sqrtn == n:
            factors.remove(sqrtn)

        if sum(factors) > n:
            abundant.append(n)
        n += 1

    return abundant

def euler23():
    # 一个“富数”列表
    abundant = abundantGen()
    n = 1
    s = 0

    while n < 28123:
        flag = False
        for i in abundant:
            if i > n: break
            try:
                # 如果n-i在列表内,那么n就可以分成两个
                # “富数”的和
                abundant.index(n-i)
                flag = True
                break
            except:
                continue

        if flag == 0:
            s += n

        n += 1

    print s

if __name__ == "__main__":
    print timeit("euler23.euler23()", "import euler23", number=3)

修改以后,结果好像正常了,但时间太长了。
引用回帖:
result = 4179871
takes 1098.32 s

[ Last edited by holmescn on 2011-6-6 at 11:11 ]
2楼2011-06-05 23:40:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
jjdg(金币+2): 辛苦了 2011-06-06 03:24:33
jjdg(金币+1): 端午节快乐 2011-06-06 03:24:40
微尘、梦想(程序强帖+1): 鼓励多交流! 2011-06-06 20:16:48
你那个富数列表生成判断有问题,不能判断到sqrt(n),必须从1-n-1
例如int(sqrt(12))==3,但是4也整除12;int(sqrt(28))==5,但是14也整除28

这个用matlab速度太慢了,改c了
CODE:
#include
#include

// compute the sum of all factors
int d(int n)
{
        int s=0;
        int i;
        for(i=2;i                 if(n%i==0)
                        s += i;
       
        return s+1; // 加上1
}

// euler23
int main(int args, char* argv[])
{
        int i, j, sum = 0;
        bool flag = false;
        for(i=1;i<28123;i++)
        {
                flag = false;
                for(j=1;j                 {
                        if(j<(i-j)) // j+(i-j)==i,只判断一次
            {
                if(d(j)>j && d(i-j)>(i-j)) // 如果j和i-j都是abundant number,改变flag结束本次循环
                {
                    flag = true;
                    break;
                }
            }               
                }

                if(!flag) // 不能表示为2个abundant number之和
                {
                        sum += i;
                        printf("%d added.\n",i); // 以为死机了,加这句看输出的
                }
        }
       
        printf("\nResult: %d\n",sum); // 打印结果

        system("PAUSE");
        return 0;
}

结果
CODE:
4179871

[ Last edited by libralibra on 2011-6-6 at 01:47 ]
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-06-06 01:43:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)


dubo(金币+1): 多谢交流 2011-06-06 14:44:16
引用回帖:
Originally posted by libralibra at 2011-06-06 01:43:30:
你那个富数列表生成判断有问题,不能判断到sqrt(n),必须从1-n-1
例如int(sqrt(12))==3,但是4也整除12;int(sqrt(28))==5,但是14也整除28

这个用matlab速度太慢了,改c了
[code] #include <stdio.h>
#inc ...

我知道你的意思啊,但我有两个append的啊。也就是说

sqrt(12)=3

i 取了 1 2 3
同时
n/i 取了 12 6 4

晕,我说我的和这么小呢, 原来我取了12了
4楼2011-06-06 08:43:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 为什么国自然不能直接公布 +5 bjdxyxy 2026-08-26 5/250 2026-09-01 17:54 by 小伟大博士
[基金申请] 面上函评意见出来了,像什么等级? 20+4 Tsingking1 2026-08-27 15/750 2026-09-01 12:23 by icm639
[论文投稿] 小白求助 投论文要求的highlights应该如何写 5+3 l1963982152 2026-08-29 4/200 2026-09-01 09:04 by 北京莱茵编辑
[基金申请] 基金未中,这种答复是模板吗? +6 zhaosm1982 2026-08-27 7/350 2026-08-31 21:18 by qdxxmc
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +6 yuleib84 2026-08-26 7/350 2026-08-31 19:46 by 鱼翔浅底1
[基金申请] 能否申诉? +7 echo8914667 2026-08-30 8/400 2026-08-31 17:00 by yihongxu
[基金申请] 为什么到现在没收到通知? +5 tannykie 2026-08-29 5/250 2026-08-30 21:05 by purplejack
[基金申请] 有没有仍没收到信息的 +7 德尚中行 2026-08-27 8/400 2026-08-30 20:52 by purplejack
[考博] 找导师 +6 yuanjiabao 2026-08-29 7/350 2026-08-30 14:40 by 生科新手
[基金申请] 我就是申请一个面上项目而已,这评审意见是按照杰青的条件评的吧? +6 gouxfjh 2026-08-28 11/550 2026-08-30 07:57 by gouxfjh
[基金申请] 国自然评审意见 +13 wangmingqi 2026-08-28 19/950 2026-08-29 10:22 by Poppy1104
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 怎么查啊 +6 huang1991js 2026-08-26 6/300 2026-08-28 08:42 by winsaint
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 国合里面能看到了 +7 一怀馨秋 2026-08-26 7/350 2026-08-26 11:23 by zhaosm1982
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 牛来!米来!面来! +8 beefly 2026-08-26 8/400 2026-08-26 08:37 by xuzhipiao
信息提示
请填处理意见