Рабочее решение (на случай, если кто-то делает это или что-то в этом роде: 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
на этом значении без знака он дает ответ, как будто это значение со знаком, и дает мне отрицательный ответ, который является неправильным; мне нужно что-то, что может извлечь последнюю цифру значения без знака.
2820130816 % 10 должно быть (для моего использования) 6 но вывод 0.
Мне нужна операция, которая даст мне 6 от 2820130816 % 10 вместо 0.
Спасибо!
Результат операции по модулю зависит от типов операнда. Так как ваш первый операнд int
, и потому что 2,820,130,816
больше максимального значения, которое может быть сохранено в 32-битном int
, вы получите неправильный результат.
Изменение типа topCopy
в unsigned
исправит эту проблему и вернет вам 6.
Поскольку вы работаете с большими числами, вы можете использовать целочисленный тип большего размера, например unsigned long long. Вы переполняете диапазон 32-битного типа int.