Way*_*ner 2 c++ precision exponential
我正在使用Project Euler来提高我的C++编码技能,为下一学期我们将要进行的编程挑战做准备(因为他们不让我们使用Python,嘘!).
我在#16,我正试图找到一种方法来保持2°°的真正精确度
例如:
int main(){
double num = pow(2, 1000);
printf("%.0f", num):
return 0;
}
Run Code Online (Sandbox Code Playgroud)
版画
10715086071862673209484250490600018105614050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
缺少大部分数字(来自python):
>>> 2**1000
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L
当然,我可以用Python 1衬里编写程序
sum(int(_) for _ in str(2**1000))
Run Code Online (Sandbox Code Playgroud)
这给了我立即的结果,但我正试图找到一种方法在C++中做到这一点.有什么指针吗?(哈哈...)
编辑:
标准库之外的东西对我来说毫无价值 - 在这些竞赛中只允许使用死树代码,而且我可能不会打印10,000行外部代码......
如果您只是跟踪char数组中的每个数字,这很容易.加倍数字是微不足道的,如果结果大于10,你只需减去10并将进位加到下一个数字.从值1开始,在倍增函数上循环1000次,然后就完成了.您可以预测所需的位数ceil(1000*log(2)/log(10)),或者只是动态添加它们.
剧透警报:看来我必须在任何人相信我之前显示代码.这是一个带有两个函数Double和Display的bignum的简单实现.为了简单起见,我没有把它变成一个类.数字以小端格式存储,首先是最低有效数字.
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;
}
Run Code Online (Sandbox Code Playgroud)