Воскресенье, 28 Апреля 2024, 08:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Вычитание двух длинных чисел (C++, Code::Blocks)
Вычитание двух длинных чисел
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 бага пофиксил ему и стипендию теперь не заберут! cry
Форум игроделов » Программирование » C/C++ » Вычитание двух длинных чисел (C++, Code::Blocks)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг