Вычитание двух длинных чисел
|
|
Ramilyanamana | Дата: Пятница, 02 Октября 2015, 12:36 | Сообщение # 1 |
Биззи Джей Ужасный
Сейчас нет на сайте
| На лабораторной дали задание: "Реализовать операцию вычитания двух длинных целых десятичных чисел." Написал код, но считает неправильно. не могу понять, в чем проблема. Будьте добры, помогите, пожалуйста, что с ним не так и правильно ли я вообще сделал. Код #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <locale.h> #include <math.h>
int difference(int *x, int *y, int *z, int length);
int main() { setlocale(LC_ALL, "rus"); std::string fNum, sNum; std::cout << "Введите первое число: #"; std::getline(std::cin, fNum); std::cout << "Введите второе число: #"; std::getline(std::cin, sNum); long int fCount = fNum.length(), sCount = sNum.length(); int *fArray = new int[fCount], *sArray = new int[sCount]; for(int i = 0; i < fCount; i++){ char temp = fNum.at(fCount - i - 1); fArray[i] = temp - '0'; } for(int i = 0; i < sCount; i++){ char temp = sNum.at(sCount - i - 1); sArray[i] = temp - '0'; } int k = 0; int length = fCount; if(fCount > sCount){ length = fCount; k = 1; } else if(sCount > fCount){ length = sCount; k = 2; } else for(int i = 0; i < length;){ if(fArray[i] > sArray[i]){ k = 1; break; } else if(sArray[i] > fArray[i]){ k = 2; break; } } int *dArray = new int[length]; if(k == 1) difference(fArray, sArray, dArray, length); if(k == 2) difference(sArray, fArray, dArray, length); return 0; }
int difference(int *x, int *y, int *z, int length){ for(int i = 0; i < length; i++){ if(i < (length - 1)){ x[i+1]--; z[i] += 10 + x[i]; } else z[i] += x[i];
z[i] -= y[i];
if((z[i] / 10) > 0){ z[i+1]++; z[i] %= 10; } } for(int i = (length - 1); i >= 0; i--) std::cout << z[i]; std::cout << std::endl; return 0; }
|
|
| |
Gudleifr | Дата: Пятница, 02 Октября 2015, 14:53 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Ramilyanamana, основная ошибка - смешение в одну кучу математики, программирования и библиотечной эрудиции. Сначала надо решить задачу (а не как Вы - неаккуратно скопировали решение для сложения), затем запрограммировать (убрав ненужные операции копирования и приведения), и ни в коем случае не полагаться на то, что библиотека решит все Ваши проблемы (например, обнулит все выделяемые массивы). Вычтите пару чисел на бумажке в клеточку - и ошибка "лишних десяток" сама вылезет.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
falcoware | Дата: Пятница, 02 Октября 2015, 17:37 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Ramilyanamana, ну во первых, ты не проинициализировал массив Z нулями и там мусор. А потом делаешь такие действия: z[i] += 10 + x[i];
Вопрос что ты получишшь на выходе?
|
|
| |
Ramilyanamana | Дата: Суббота, 03 Октября 2015, 04:21 | Сообщение # 4 |
Биззи Джей Ужасный
Сейчас нет на сайте
| falcoware, с этим разобрался. но считает все равно не правильно. например из числа 12345 вычесть 54321. в ответе получим -58024, а должны получить -41976
|
|
| |
falcoware | Дата: Суббота, 03 Октября 2015, 07:14 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Ramilyanamana, а ты посмотри, что если поменять местами цифры, то результат верный. Может в этом дело?
|
|
| |
Ramilyanamana | Дата: Суббота, 03 Октября 2015, 09:33 | Сообщение # 6 |
Биззи Джей Ужасный
Сейчас нет на сайте
| falcoware, в этом-то и дело. в главной функции я делаю проверку, чему равна k. и только после этого вызываю функцию. при разных значениях k в функцию передаются эти два числа в разной последовательности
|
|
| |
falcoware | Дата: Суббота, 03 Октября 2015, 09:45 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Ramilyanamana,
Код for(int i = 0; i < length;){ if(fArray[i] > sArray[i]){ k = 1; break; } else if(sArray[i] > fArray[i]){ k = 2; break; } }
А тебе не кажется, что надо сравнивать последнюю цифру? А ты на первой сразу вылетаешь, которая ниочем не говорит!
|
|
| |
Gudleifr | Дата: Суббота, 03 Октября 2015, 09:50 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| <Вычеркнуто внутренним цензором>
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Суббота, 03 Октября 2015, 09:52 |
|
| |
falcoware | Дата: Суббота, 03 Октября 2015, 20:55 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Ramilyanamana, хоть бы плюс в репу дал! 2 бага пофиксил ему и стипендию теперь не заберут!
|
|
| |