"Следите" и "профиль" две очень отличающихся задачи, по моему мнению.
Для профилирования (не предпросмотр в реальном времени на том, что продолжается прямо сейчас, но видеть, какие запросы занимают большую часть времени и т.д.), проверьте pgFouine:
http://pgfouine.projects.postgresql.org/
Это позволит Вам видеть, какие запросы являются интенсивно использующими ресурсы, и принимают соответствующие меры: Добавьте недостающие индексы, перепишите запросы с помощью другого techiques и т.д.
Это должно работать, если 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);
}
}
Задача 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;
(Плюс немного дополнительных хлопот, чтобы применить ту же логику и к десятичным цифрам.)
Похоже, у вас была правильная идея и, возможно, вы просто переосмыслили реализацию?
Уважаемый профессор, вычитание следует определять в терминах сложения. Я перегрузил унарный оператор «-» и определил процедуру сложения bignum в другом месте. Я использую дополнение 9 , чтобы упростить / ускорить добавление (не надоедает переносить!) С поиском ответов на основе таблицы (зачем вычислять суммы, когда их всего 10?). Процедура вычитания bigNum (в соответствии с вашими требованиями) выглядит следующим образом:
void bigDifference(bigNum N1, bigNum N2, bigNum *N3) {
bigSum(N1, -N2, N3);
}