好吧,我把头撞在桌子上了。我试图通过将数字保存在'char's向量中来计算2的巨大幂数(超出uint64_t数据类型所能容纳的能力)。这是我的程序,然后是我的实际输出:
/*
This program doubles a very large number by using a vector of char types
Usage: program.exe [number]
Output will be 2^[number]
*/
#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;
int main(int argc, char *argv[])
{
vector<char> BigNum;
BigNum.push_back('2');
int carry=0, digit;
int power=atoi(argv[1]);
power-=1;
for(int x=0;x<power;x++) //Example: going from 16 to 32. x==4
{
for(int y=BigNum.size()-1;y>=0;y--) //Go from BigNum[1] to BigNum[0] ('6' then '1')
{
digit=atoi(&BigNum[y]); //digit = 6, then digit=1
BigNum[y]=(char)(((digit*2+carry)%10)+48); //BigNum[1]=(char)(6*2+0)%10+48 = '2' in char
//BigNum[0]=(char)(1*2+1)%10+48 = '3' in char
carry=digit*2/10; //carry=1, then 0
}
if(carry==1) //does not execute. BigNum=={'3','2'}
{
BigNum.push_back('0');
for(int y=BigNum.size()-1;y>0;y--)
{
BigNum[y]=BigNum[y-1];
}
BigNum[0]='1';
carry=0;
}
}
for(int x=0;x<BigNum.size();x++) cout<<BigNum[x];
}
编译:
g++ program.cpp -o program
所以这是我运行程序时的结果:
C:\MyApps\program 2
4
C:\MyApps\program 3
8
C:\MyApps\program 4
16
好吧,到目前为止看起来还不错……甚至在我的“ if(carry == 1)”部分,我将一个数字推到矢量有效部分的前部,因为我们将“ 1”携带成两位数。让我们继续:
C:\MyApps\program 5
52
什么?
C:\MyApps\program 6
26
什么什么?
C:\MyApps\program 654
84
C:\MyApps\program 654444
00
它永远不会达到三位数...到底发生了什么?
最佳答案
您正在将atoi
应用于不是以空字符结尾的字符串。实际上,它在内存中的外观很可能像是一个以null终止的字符串,但实际上并不是您想要的样子。
解决此问题的最干净方法可能是在向量中存储实际数字值0..9,而不是ASCII'0'..'9'。您会发现代码也是如此。
关于c++ - 计算2的幂的不良结果[C++],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11421140/