24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1951  |  回复: 14
本帖产生 2 个 程序强帖 ,点击这里进行查看

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+3): 谢谢参与! 2011-05-27 15:25:23
2**1000太大了,matlab不给力,只好混编,因为我喜欢tic/toc,虽然不精确,但是方便

matlab code
CODE:
%% What is the sum of the digits of the number 2^1000
function result = euler16()
tic;
!python -c "print sum([int(digit) for digit in str(2**1000)])";
toc;
end

结果
CODE:
% solved by invoking python script:
% 1366
% Elapsed time is 0.223183 seconds.

如果是python,就一句话,少了matlab调用,应该快不少
CODE:
import timeit
t = timeit.Timer('print sum([int(digit) for digit in str(2**1000)])')
print t.timeit(1)

结果时间
CODE:
1366
0.000781104861093

[ Last edited by libralibra on 2011-5-26 at 23:23 ]
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
11楼2011-05-26 23:17:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

匿名

用户注销 (小有名气)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+2): 谢谢参与! 2011-05-27 15:25:36
本帖仅楼主可见
12楼2011-05-26 23:44:27
已阅   申请程序强帖   回复此楼   编辑   查看我的主页

holmescn

金虫 (正式写手)

★ ★
微尘、梦想(金币+2, 程序强帖+1): 谢谢交流讨论! 2011-05-29 16:21:27
和楼上算法一样,用C实现了一下。不过,如果用4或者8作为底数,应该会快一点点。
当然不用的话,也不慢。
CODE:
#include

int main(int argc, char** argv) {
    char digits[500];
    int  len = 1;
    int  c = 0;
    int  r = 0;
    int  i, j;


    digits[0] = 1;

    for (i = 0; i < 1000; i++) {
        c = 0;
        for (j = 0; j < len; j++) {
            r = digits[j]*2 + c;
            c = r / 10;
            digits[j] = r % 10;
        }

        if(c > 0) {
            digits[len] = c;
            len += 1;
        }
    }

    printf("digits len = %d\n", len);

    r = 0;
    for(i = len - 1; i >= 0; i--) {
        r += digits[i];
        printf("%d", digits[i]);
    }
    printf("\nsum = %d\n", r);

    return 0;
}

13楼2011-05-27 17:01:32
已阅   回复此楼   关注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的回帖

holmescn

金虫 (正式写手)

★ ★ ★ ★ ★
微尘、梦想(金币+5): 谢谢交流! 2011-05-29 16:22:21
LS的代码确实有点 quick & dirty。不过, 如果你理解了我的意思的话,可以写出如下更高效的代码。
CODE:
#include

int multiply(char* digits, int len, int factor, int times) {
    int i, j;
    int c, r;

    for(i = 0; i < times; i++) {
        c = 0;
        for(j = 0; j < len; j++) {
            r = digits[j] * factor + c;
            c = r / 10;
            digits[j] = r % 10;
        }

        if (c > 0) {
            digits[len] = c;
            len += 1;
        }
    }

    return len;
}

int main(int argc, char** argv) {
    char digits[500];
    int  len = 1;
    int  r, i;

    digits[0] = 1;

    len = multiply(digits, len, 8, 333);
    len = multiply(digits, len, 2, 1);

    printf("digits len = %d\n", len);

    r = 0;
    for(i = len - 1; i >= 0; i--) {
        r += digits[i];
        printf("%d", digits[i]);
    }
    printf("\nsum = %d\n", r);

    return 0;
}

15楼2011-05-28 07:26:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 holmescn 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见