不使用 BigInt 计算 2^1000 之和
你们中的一些人可能会注意到这个问题是来自 问题 16 href="http://projecteuler.net/" rel="nofollow noreferrer">欧拉项目。我已经使用 C# 4.0 的新“bigInt”功能解决了这个问题,该功能相当简单,但也没有真正学习我应该学习的所有内容。我假设因为它是 2 ^ 1000 ,所以会有某种位移解决方案,但我无法弄清楚它到底是如何工作的。
有谁知道不使用bigint计算2^1000的方法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这个问题最难的部分不是计算(只是从 1 开始,然后加倍 1000 次),而是以十进制显示答案。考虑到这一点,您可能会发现在概念上更容易以某种形式的 BCD 表示形式(例如 base-1000)执行计算。然后执行 2 的长乘法一千次。这是一个Python解决方案:
The hardest part of this problem is not the computation (just start with 1 and double it 1000 times), but displaying the answer in decimal. With this in mind, you might find it conceptually easier to perform the computation in some form of BCD representation, such as base-1000. Then perform long multiplication by 2 a thousand times. Here's a Python solution:
这是在 python 中使用数字列表(或数组)来完成此操作的一种相当幼稚的方法
Here is a rather naive way to do it in python just using a list(or array) of digits
您可以自己实现 BigInt,这可能会引入错误,并可能导致解决方案速度慢得多。典型的实现是自己手动执行数学运算(以每个数字为基础),使用一些高基数,例如基数 2^16 数字。
You could implmeent BigInt yourself, potentially introducing bugs and likely result in a much slower solution. A typical implementation is to manually perform the maths yourself (on a per digit basis), with some high base, such as base 2^16 numbers.
问题实际上是 2^1000 到基数 10 的转换。一种简单的方法是实现某种任意长度的 BCD(二进制编码十进制)并计算 BCD 中的 2^1000。 250 字节的数组就足够了。然后你只需编写对任意长度的 BCD 数执行 *2 的方法并调用它 1000 次)。然后提取和求和数字就很容易了。
即使使用 C 等语言也很容易实现。
The problem is really conversion of 2^1000 to base 10. One easy way could be to implement some kind of BCD (Binary Coded Decimal) of arbitrary length and compute 2^1000 in BCD. An array of 250 bytes would be more than enough. Then you just have to write the method to perform *2 on a BCD number of arbitrary length and call it 1000 times). Then extracting and suming the digits is easy.
That's very easy to implement even in languages such as C.
好吧,
更严肃地说,x 位整数最多可以容纳
1<。要实际计算
1<<1000
,您需要一个 1000 位处理器(技术上是 1001 位,但现在谁在数)。由于这是不可行的,您唯一的选择就是模拟它(这就是 bigint 所做的)。OK here goes:
On a more serious note, the most you can hold in an x-bit integer is
1<<x-1
. To actually calculate1<<1000
you'd need a 1000-bit processor (technically 1001-bit, but who's counting at this point). Since that's not feasable, your only choice is to emulate it (and that's what bigint does).实际上没有什么可计算的:
2^1000 = (1000...[994]...000)[Base2]
。已经是‘结果’了。如果您想知道如何存储它,您的机器不具备存储其确切值的精度。因此它要么是 BigInt,要么是双精度近似值 Math.Pow(2, 1000)。
编辑:我现在看到您从评论中只想要数字之和。请参阅解决方案之一。
There's nothing to calculate actually:
2^1000 = (1000...[994]...000)[Base2]
. It's a 'result' already.If you want to know how to store it, you machine doesn't have the precision to store its exact value. So it's either a
BigInt
, or the double approximate valueMath.Pow(2, 1000)
.Edit: I see now you from comments just want the sum of the digits. See one of the solutions.
我将尝试在不给出太多代码的情况下回答...
1)使用字符串来保存乘积
2)执行长乘法(就像您在学校所做的那样)
在这里打印产品
记事本编码...所以如果有人发现错误,请纠正它们。
I'll try and answer without giving away much code...
1) Use a String to hold the Product
2) Perform Long Multiplication (like you did in school)
print prod
Notepad-Coding here...so if anyone finds bugs please correct them.