24小时热门版块排行榜    

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

huycwork

金虫 (著名写手)

[交流] 欧拉工程,第二十一题,计算10000以下亲和数的和。 已有5人参与

咳咳,放假与睡觉之前再发一题,E文不好,诸位见谅哈~

定义d(n)是n的所有约数的和。

如果d(a) = b,d(b) = a且满足a != b,则说a与b是一组亲和数。

例如,220的所有约数是1, 2, 4, 5, 10, 11, 20, 22, 44, 55与110,则d(220) = 284;而284的所有约数是1, 2, 4, 71与142,累加得:d(284) = 220。

试计算10000以下所有亲和数之和。
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

漩涡的中心有一块空地,空空的。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 多谢交流 2011-06-04 14:44:16
余泽成(金币+2): 鼓励交流! 2011-06-04 19:31:55
引用回帖:
Originally posted by huycwork at 2011-06-02 22:34:29:
C++代码:
[code]
#include <iostream>
enum {BUFSZ = 10000};

size_t eular21(){
        size_t buf[BUFSZ];
        memset(buf, 0, sizeof buf);
        for(size_t i = 1; i < BUFSZ; ++i){
                for(size_t j = ...

你似乎使用了什么数学方法,而不是直接计算的。能不能讲讲啊。

还有,你对size_t显然存在滥用,虽然size_t是int的一个typedef,但这个主要是为了明确语义才引用的,而你把一些int语义的东西写成size_t,会让人产生误会。
5楼2011-06-04 09:09:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 15 个回答

huycwork

金虫 (著名写手)

★ ★ ★
dubo(金币+1): 多谢交流 2011-06-04 14:42:08
余泽成(金币+2, 程序强帖+1): 鼓励交流! 2011-06-04 19:31:23
C++代码:
CODE:
#include
enum {BUFSZ = 10000};

size_t eular21(){
        size_t buf[BUFSZ];
        memset(buf, 0, sizeof buf);
        for(size_t i = 1; i < BUFSZ; ++i){
                for(size_t j = i+i; j < BUFSZ; j+=i){
                        buf[j] += i;
                }
        }
        size_t d, s = 0;
        for(size_t i = 2; i < BUFSZ; ++i){
                d = buf[i];
                if(i == buf[d]){
                        if(i != d)
                                s += i;
                }
        }
        return s;
}

int main(){
        std::cout< }

漩涡的中心有一块空地,空空的。
2楼2011-06-02 22:34:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 多谢交流 2011-06-04 14:43:26
余泽成(金币+2): 鼓励交流! 2011-06-04 19:31:33
结果
CODE:
31626
elapsed time=0.020000 seconds.

c代码
CODE:
#include
#include
#include

#define TIMERSTART clock_t start_time,stop_time;double elapsed_time;start_time = clock();
#define TIMERSTOP stop_time = clock();elapsed_time=(double)(stop_time-start_time)/CLOCKS_PER_SEC;printf("elapsed time=%f seconds.\n",elapsed_time);


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;
}

int euler21(int n){
  int i,sum=0,tmp;
  for(i=3;i     tmp=sumdivisors(i);
    if(tmp!=i&&tmp       sum+=i;
    }
  }
  
  return sum;
}


int main(void){
int i;

TIMERSTART;

printf("%d\n",euler21(10000));
  
TIMERSTOP;

  return 0;
}

3楼2011-06-03 13:22:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 多谢交流 2011-06-04 14:43:53
余泽成(金币+2, 程序强帖+1): 鼓励交流! 2011-06-04 19:31:45
看笨拙的matlab吧
CODE:
function result = euler21()
tic;
result = [];
for i=1:10000
    if d(i)~=i && d(d(i))==i
        result = [result,i];
    end
end
result = sum(unique(result));
toc;
end

%% Let d(n) denote the sum of proper divisors of n (numbers less than n which divide evenly into n).
% For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284.
% sub function to compute d(n), called by 21 and 23
function s = d(n)
s = 0;
for i=1:n-1
    if mod(n,i)==0
        s = s+i;
    end
end
end

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2011-06-03 16:36:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见