我正在研究 Project Euler,以复习我的 C++ 编码技能,为下学期我们将要面对的编程挑战做准备(因为他们不让我们使用 Python,嘘!)。
我在#16,我正试图找到一种方法来保持 2¹°°° 的真实精度
例如:
int main(){
double num = pow(2, 1000);
printf("%.0f", num):
return 0;
}
打印
10715086071862673209484250490600018105614050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
缺少大部分数字(来自 python):
>>> 2**1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L
当然,我可以用 Python 1 内衬编写程序
sum(int(_) for _ in str(2**1000))
这会立即给我结果,但我正试图找到一种在 C++ 中执行此操作的方法。任何指针? (哈哈……)
编辑:
标准库之外的东西对我来说毫无值(value)——在那些竞赛中只允许使用死树代码,而且我可能不会打印出 10,000 行外部代码...
最佳答案
如果您只跟踪字符数组中的每个数字,这很容易。将一个数字加倍是微不足道的,如果结果大于 10,你只需减去 10 并在下一个数字上加一个进位。从值 1 开始,将加倍函数循环 1000 次,就完成了。您可以使用 ceil(1000*log(2)/log(10))
预测所需的位数,或者动态添加它们。
剧透警告:看来我必须先展示代码才能让任何人相信我。这是一个 bignum 的简单实现,它有两个函数,Double 和 Display。为了简单起见,我没有把它作为一个类。数字以小端格式存储,最低有效位在前。
typedef std::vector<char> bignum;
void Double(bignum & num)
{
int carry = 0;
for (bignum::iterator p = num.begin(); p != num.end(); ++p)
{
*p *= 2;
*p += carry;
carry = (*p >= 10);
*p -= carry * 10;
}
if (carry != 0)
num.push_back(carry);
}
void Display(bignum & num)
{
for (bignum::reverse_iterator p = num.rbegin(); p != num.rend(); ++p)
std::cout << static_cast<int>(*p);
}
int main(int argc, char* argv[])
{
bignum num;
num.push_back(1);
for (int i = 0; i < 1000; ++i)
Double(num);
Display(num);
std::cout << std::endl;
return 0;
}
关于c++ - C++ 中的 double (或 pow(2, 1000)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3389195/