24小时热门版块排行榜    

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

holmescn

金虫 (正式写手)

[交流] Euler 工程第十六题:2的1000次方的各项和 已有6人参与

这两天新版开通,版里很热闹,也就没有放题出来。今天放一个题吧。

已知2的15次方等于32768,其各项和为:3+2+7+6+8 = 26 。
那么2的1000次方的各项和是多少呢?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+2, 程序强帖+1): 谢谢交流讨论! 2011-05-29 16:22:05
楼上的看着很不错
这里贴个丑陋的代码 时间0.0000s
CODE:
1366
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
elapsed time=0.000000 seconds.

代码:
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);

#define N 100

static int num[N];

void multiply(int n) {
  int i=0,tmp,residual=0;
  for(i=0;i     tmp=num[i]*n+residual;
    num[i]=tmp%10000;
    residual=(tmp-num[i])/10000;
  }
  return;
}

int euler16(int n){
  int i,sum=0;
  
  for(i=1;i     multiply(2);
  }
  
  for(i=0;i     sum+=(num[i]/1000+(num[i]%1000)/100+(num[i]%100)/10+num[i]%10);
  }
  
  return sum;
}


int main(void){
int i;

TIMERSTART;
num[0]=1;

printf("%d\n",euler16(1000));

for(i=N-1;i>=0;i--){
   printf("%04d",num[i]);
}
printf("\n");


TIMERSTOP;

  return 0;
}

14楼2011-05-27 21:05:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 15 个回答

huycwork

金虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+2): 谢谢参与! 2011-05-27 15:24:11
来个Perl版:
CODE:
#!/usr/bin/perl
use bigint;
$sum += $_ foreach(2**1000 =~ /(.)/g);
print "result:$sum\n";

结果:1366
漩涡的中心有一块空地,空空的。
2楼2011-05-26 21:38:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+2): 谢谢交流讨论! 2011-05-27 15:24:41
引用回帖:
Originally posted by huycwork at 2011-05-26 21:38:51:
来个Perl版:
CODE:
#!/usr/bin/perl
use bigint;
$sum += $_ foreach(2**1000 =~ /(.)/g);
print "result:$sum\n";

结果:1366

咳,我突然想到一个好玩的东西...

对于一个数的大指数出来的各个位数,0-9的概率分布趋向于均匀分布~

那么我们可以做大致的估算:

2^1000的位数为

向下取整(1000 * log 2) + 1 = 302 位

对于每个位的期望为4.5,然后所有位的和就约等于

302 * 4.5 = 1359

很接近,数学真是奇妙啊,哈哈哈~

嗯,回到正题,这个题考的是两个东西:

1. 大数乘法
2. 整数动态规划,求最少大数乘法次数的步骤

好的C算法在一般PC上应该能把运算时间控制在0.5秒以内,嗯~

PS:土土地思考,从2^31=2147483648开始算的话:
2^31 * 2^31 = 2^62
2^62 * 2^62 = 2^124
2^124 * 2 = 2^125
2^125 * 2^125 = 2^250
2^250 * 2^250 = 2^500
2^500 * 2^500 = 2^1000
只需要6次大数乘法,嗯,不确保这是最优的分法...不过这么算已经挺快了...

[ Last edited by sudo on 2011-5-26 at 22:13 ]
3楼2011-05-26 21:52:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+1): 谢谢交流讨论! 2011-05-27 15:26:19
引用回帖:
Originally posted by sudo at 2011-05-26 21:52:34:
咳,我突然想到一个好玩的东西...

对于一个数的大指数出来的各个位数,0-9的概率分布趋向于均匀分布~

那么我们可以做大致的估算:

2^1000的位数为

向下取整(1000 * log 2) + 1 = 302 位

对于 ...

这么说的话,这个好玩的东西还有另外一个扩展了:散列码,乘法运算的过程中,除了首位和末位之外,中间的所有位都与因数的位数相关,得出的结果中包含了各种离散的因素,得出的值也必定是均匀分散的。期望值应该也非常接近这样的猜测

这题以乘方来优化的话,乘法次数是少了许多,效率却不见提高许多,软件实现的大数类还是不如硬件geilivable啊……

突然想实现一个补码运算的大数类了
漩涡的中心有一块空地,空空的。
4楼2011-05-26 22:29:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 龙 兔 虎 猫 高级回复 (可上传附件)
信息提示
请填处理意见