16-di git манипуляции с числами на 32-битном языке программирования - PullRequest
0 голосов
/ 26 мая 2020

У меня простая проблема, но поскольку этот «язык программирования», который я использую, является 32-битным и поддерживает только базовые c функции, такие как сложение, вычитание, умножение, деление и конкатенация (буквально это все), я У меня проблемы.

Для ввода у меня есть 16 di git число, например: 3334,5678,9523,4567

Я хочу затем вычесть 2 других случайных 16 di git числа из этого номера и проверьте, равны ли первая и последняя цифры 1.

Например, если два других числа - 1111,1111,1111,1111 и 1234,5678,9123,4565. Мой окончательный номер: 0988,8888,9288,8891.

Здесь последнее число - 1, но первое - 0, поэтому тест не пройден.

Проблема в в 32-битных системах возникают огромные ошибки из-за недостаточной точности, обеспечиваемой битами. Какими способами можно обойти эту проблему?

1 Ответ

0 голосов
/ 26 мая 2020

Если вы используете такой язык, как C или Java, вы сможете использовать long для создания 64-битного целого числа. Если это невозможно, вы можете разделить числа на два 32-битных числа, одно для верхней половины, а другое для нижней.

Примерно так:

//Each half is 8 digits to represent 8 of the 16
//Because of this each half should be less than 100000000
int upperHalf = 33345678;
int lowerHalf = 95234567;

//randomInt represents a function to generate a random
//integer equal to or greater than 0 and less than the
//argument passed to it
int randUpperHalf = randomInt(100000000);
int randLowerHalf = randomInt(100000000);

int lowerHalf = lowerHalf - randLowerHalf;

//If lowerHalf was a negative number you need to borrow from the upperHalf
if (lowerHalf < 0) {
    upperHalf = upperHalf - 1;
    lowerHalf = lowerHalf + 100000000;
}

upperHalf = upperHalf - randUpperHalf;

//Check that the first and last digits are 1
if ((upperHalf / 100000000) == 1 && (lowerHalf % 10) == 1) {
    //The first and last digits are 1
}

Изменить: Комментарии были добавлены, чтобы лучше объяснить код. (lowerHalf% 2) == 1 был изменен на (lowerHalf% 10) == 1 и теперь должен быть в состоянии определить, заканчивается ли число на 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...