2^1000的各位数字和

这两天在http://projecteuler.net/problem=16看到这样一个问题。本来这个利用MATLAB的符号计算是相当easy,一句话即可搞定:

 sum(char(sym('2^1000'))-'0') 结果是1366。但如果不用符号计算的话就需要些技巧了。

注意到大数可以用10的n次幂的多项式来表示,因此大数相乘对应的就是多项式乘积,也就是卷积。因此可以得到下面MATLAB代码:

a = num2str(2^50)-'0';
for k = 1:2
a = BigInteM(a,a);
end
b = a;
for k = 1:2
b = BigInteM(b,b);
end
ab = BigInteM(a,b);
sum(ab);

BigInteM的代码如下:

function c = BigInteM(a,b)
%a,b为0-9整数数组
c = conv(a,b);
for k = length(c):-1:2    
    c(k-1) = c(k-1)+floor(c(k)/10);
    c(k) = mod(c(k),10);
end
tmp = num2str(c(1))-'0';
c = [tmp,c(2:end)];

 

 

posted @ 2012-02-11 14:04  rocwoods  阅读(320)  评论(0编辑  收藏  举报