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)];

 

 

转载于:https://www.cnblogs.com/rocwoods/archive/2012/02/11/2346503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值