Модуль целого без знака

Рабочее решение (на случай, если кто-то делает это или что-то в этом роде: 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

Проблема:

Проблема возникает, когда я пытаюсь напечатать число, я уже реализовал метод для сложения, вычитания и т. Д. При принятии решения, что печатать для каждой цифры числа, которое я делаю так:

  1. Возьмите цифру сравнения, начинающуюся с конца (6) 4294967296
  2. Добавьте это к topValue% 10 (конечный номер topValue)
  3. Выведите значение и разделите оставшееся значение 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.

TL; DR:

Мне нужна операция, которая даст мне 6 от 2820130816 % 10 вместо 0.

Спасибо!

1

Решение

Результат операции по модулю зависит от типов операнда. Так как ваш первый операнд int, и потому что 2,820,130,816 больше максимального значения, которое может быть сохранено в 32-битном int, вы получите неправильный результат.

Изменение типа topCopy в unsigned исправит эту проблему и вернет вам 6.

Демо на Ideone.

4

Другие решения

Поскольку вы работаете с большими числами, вы можете использовать целочисленный тип большего размера, например unsigned long long. Вы переполняете диапазон 32-битного типа int.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector