工作解决方案(以防任何人这样做或类似的事情:P) 这不是最优化的解决方案,但它确实适用于32位我会发布一个更优化的解决方案,对每个值使用bigNum而不是unsigned int,因为谁知道你的值可能是(2 ^ 128)* (2 ^ 32):P
void print(){
//Hold temporary backwards string array
std::string backwards;
//Copy of data and remainder to hold previous loop's value
unsigned int topCopy = topValue, remainder = 0;
//Loop through each digit of highest 32 bit number
for(int i = 0; topCopy != 0; i++){
//Find value of all added max values
unsigned int value = maxValues*maxDigits[i];
//Find value of topValue's last digit
value += topCopy % 10;
//Add in the remainder from the previous loop
value += remainder;
//Create remainder so the printing value is correct
remainder = value / 10;
//append the value to the string
backwards += value % 10;
//setup for the next digit
topCopy /= 10;
}
//append the last digit
backwards += remainder;
//print backwards
for(int i = backwards.length()-1; i >= 0; i--){
printf("%i", backwards[i]);
}
printf("\n");
}
我正在尝试创建一个在C ++中处理任意长度无符号整数值的类,在有人说之前,我完全清楚已经存在已经存在的库来处理这个功能。这对我来说纯粹是一种学习经历。
我将以这种格式存储我的课程中的值:
topValue: stores the remainder of the number % 4294967296
maxValues: stores how many max values are needed to hold the number
示例:
maxValues = 4
topValue = 2820130816
maxValues *= 4294967296
maxValues == 17179869184
maxValues + topValue == 20000000000
当我尝试打印数字时出现问题,我已经实现了加法减法等方法...当我为这个数字的每个数字决定要打印的内容时我会这样做:
打印值并将剩余的topValue除以10得到下一个值
const char maxDigits[] = {6, 9, 2, 7, 6, 9, 4, 9, 2, 4};
void print(){
int topCopy = topValue;
for(int i = 0; topCopy != 0; i++){
int value = maxValues*maxDigits[i];
value += topCopy % 10; // RIGHT HERE IS THE ISSUE
value %= 10;
//print value
topCopy /= 10;
}
}
当对这个无符号值执行行topCopy % 10
时,它会给出答案,就像它是一个有符号的值,并给出一个不正确的否定答案,我需要的是可以提取无符号值的最后一位数的东西
2,820,130,816 % 10 应该(对我来说) 6 但输出 0 。
我需要一个操作,从 2,820,130,816 % 10 而不是0来给我6个。
谢谢!
答案 0 :(得分:4)
模运算的结果取决于操作数的类型。由于您的第一个操作数是int
,并且因为2,820,130,816
大于可以存储在32位int
中的最大值,所以会得到错误的结果。
将topCopy
的类型更改为unsigned
可以解决此问题,并返回6。
答案 1 :(得分:0)
由于您正在处理一些大数字,因此您可能希望使用更大的整数类型,例如unsigned long long。你溢出了32位int的范围。