Большое вычитание числа в C

"Следите" и "профиль" две очень отличающихся задачи, по моему мнению.

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

http://pgfouine.projects.postgresql.org/

Это позволит Вам видеть, какие запросы являются интенсивно использующими ресурсы, и принимают соответствующие меры: Добавьте недостающие индексы, перепишите запросы с помощью другого techiques и т.д.

5
задан Svante 22 August 2009 в 20:48
поделиться

3 ответа

Это должно работать, если N1> = N2 . Это также предполагает, что массивы расположены как dn ... d2d1d0.e0e1 ... em .

char digchr(int); // Converts a single-digit integer into a character.

void difference(bigNum N1, bigNum N2, bigNum *N3) {
    int carry = 0;

    for (int i = MAX / 2 - 1; i >= 0; i--) {
        int diff = N1.decimalDigits[i] - N2.decimalDigits[i] - carry;
        if (diff < 0) { 
            diff += 10;
            carry = 1;
        } else {
            carry = 0;
        }

        N3->decimalDigits[i] = digchr(diff);
    }

    for (int i = 0; i < MAX; i++) {
        int diff = N1.digits[i] - N2.digits[i] - carry;
        if (diff < 0) {
           diff += 10;
           carry = 1;
        } else {
            carry = 0;
        }

        N3->digits[i] = digchr(diff);
    }
}
5
ответ дан 18 December 2019 в 09:09
поделиться

Задача BigNumber в большинстве классов информатики предназначена для того, чтобы вы должны были выполнять арифметические операции «вручную» точно так, как вы описываете: преобразовать каждый символ в целое число, вычесть и заимствовать, где это необходимо .

Ваш план атаки, как вы его описали, должен состоять всего из нескольких строк. В псевдокоде, что-то вроде этого:

for each character (right to left):
    difference = N1.digit[i] - N2.digit[i];
    if (difference < 0)
        N1.digit[i - 1]--;
        difference += 10;
    N3.digit[i] = difference;

(Плюс немного дополнительных хлопот, чтобы применить ту же логику и к десятичным цифрам.)

Похоже, у вас была правильная идея и, возможно, вы просто переосмыслили реализацию?

10
ответ дан 18 December 2019 в 09:09
поделиться

Уважаемый профессор, вычитание следует определять в терминах сложения. Я перегрузил унарный оператор «-» и определил процедуру сложения bignum в другом месте. Я использую дополнение 9 , чтобы упростить / ускорить добавление (не надоедает переносить!) С поиском ответов на основе таблицы (зачем вычислять суммы, когда их всего 10?). Процедура вычитания bigNum (в соответствии с вашими требованиями) выглядит следующим образом:

void bigDifference(bigNum N1, bigNum N2, bigNum *N3) {
    bigSum(N1, -N2, N3);
}
3
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: