Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинная арифметика. Помогите с вычитанием, Не могу разобраться с вычитанием. 
:(
    Опции темы
Levetta
Дата 5.3.2017, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.3.2017

Репутация: нет
Всего: нет



Добрый день! Помогите пожалуйста разобраться! Нужно написать программу для вычитания двух целых чисел, разрядности около 200. У меня есть программа для сложения. Писала правда не сама, код нашла и немного переделала под себя, как мне понятнее. Теперь нужно из этой программы сделать вычитание. Вот тут и загвоздка, никак не могу сообразить, как это сделать. Как я понимаю, сначала нужно сравнить 2 числа по длине( то есть, определить бОльшее), если длины одинаковы, то сравнить первые цифры и затем выполнить само вычитание, сложность для меня возникла с тем, когда нужно занимать десяток из предыдущего разряда и вообще, получается куча ветвлений, что-то я совсем в них потерялась...  Ниже привела готовый код для сложения, а после - мои жалкие попытки получить программу для вычитания. Пожалуйста, не кидайтесь тапками, если дело совсем плохо, я не шарю, а очень нужно smile Буду признательна за любую помощь!
Цитата

#include <iostream>
using namespace std;
char * sum(char *a, char *b) {
  int len1 = strlen(a); // количество разрядов первого числа
  int len2 = strlen(b); // количество разрядов второго числа
  char *c;
  int razr = 0; // перенос в следующий разряд
    int k;
  if (len1 > len2)
   k = len1;
  else ( k = len2);
  c = new char[k + 2];
  int i, j; 
  k++;
  c[k] = '  \0'; // завершающий нуль-символ результата
  k--;
    for (i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0; i--, j--) {
    //char dig1 = i < 0 ? 0 : a[i] - '0'; // если разряд отсутствует, взять 0 //dig1=0 else dig1=a[i]-'0';
  //for (i = lena-1, j = lenb -1; i>=0, j>=0; i--,j--)
  
   //for (int j = lenb-1; j>=0; j++)
   
   char sum1;
   if (i < 0) sum1 = 0;
   else sum1 = a[i]-'0';
    //char dig2 = j < 0 ? 0 : b[j] - '0'; // иначе преобразовать символ в цифру
   char sum2;
   if (j < 0) sum2 = 0;
   else sum2 = b[j] - '0';
    char sum = sum1 + sum1 + razr; // сложить две цифры разрядов и перенос
    if (sum > 9) { // если сумма разрядов >9
      sum = sum - 10; // отнять 10
      razr = 1; // и сгенерировать перенос в следующий разряд
    }
    else razr = 0; // переноса нет
    c[k] = sum + '0'; // преобразовать цифру в символ
    k--; // перейти к следующему разряду
  
  }
  if (razr == 0) return &c[1]; // в старшем разряде результата пусто
  else {
    c[k] = razr + '0'; // заполнить старший разряд результата
    return c;
  }
}
int main() {
    setlocale (LC_ALL, "Russian"); 
    cout << "Программа для сложения двух больших чисел: " << endl; 
  char a[203];
  char b[203];
  cout << "Введите первое слагаемое: " << endl;
  cout << "a = ";
  cin >> a;
  cout << "Введите второе слагаемое: " << endl;
  cout << "b = ";
  cin >> b;
  cout << "Полученная сумма: " << endl;
  cout << a << "+" << b << "=" << sum(a, b) << endl;
  //cin.get();
  return 0;
}

 

Цитата

#include <iostream>
using namespace std;
int compare(char *a, char *b)
{
    int t, k;
  int len1 = strlen(a); // количество разрядов первого числа
  int len2 = strlen(b); // количество разрядов второго числа
  int i;

  k = max(len1,len2);

  t = 0; 
  char *c;
  c = new char[k+2];
  k++;
  c[k] = '\n';
  k--;
  if (len1 > len2)
    t = 1;
  if (len2 > len1)
    t = 2;
  for (int i = 0; i < len1; i++)  // поразрядное сравнение
  {
    if (a[i] > b[i])
      t = 1;
    if (a[i] < b[i])
      t = 3;
  }
  return t;

  char umen, vich, razn;
  if ( t == 1) // решила начать с самого простого случая и тут же споткнулась
  {
  for ( i = k; i > 0; i --)
  {
   umen = a[i]-'0';
   vich = b[i] - '0';
   razn = umen - vich;
  }
  c[k]=razn+'0';
k--;
  return c; 
  }
  
}
int main() 
{
  char a[203];
  char b[203] ;
  cout << "a = ";
  cin >> a;
  cout << "b = ";
  cin >> b;
  cout << compare(a, b) << endl;
    return 0;
}


Это сообщение отредактировал(а) Levetta - 5.3.2017, 17:08
PM MAIL   Вверх
vpf
Дата 5.3.2017, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 14.11.2016
Где: Moscow

Репутация: нет
Всего: нет



Код

// код на Java максимально близко к C++
        char[] a = new char[]{'1','0','0','0','0','5'}; // массив со значением  100005
        char[] b = new char[]{'9','7'}; // массив со значением 97

        int len = Math.max(a.length, b.length);

        char[] c = new char[len];


        int[] a2 = new int[len];  // взяты int просто удобнее с ними
        int[] b2 = new int[len];
        int[] c2 = new int[len];
// заполнили простыми числами
        for (int i = 0; i < len; i++) {
            if (i < a.length)
                a2[i] =  (a[a.length - i - 1] - '0'); // вычитаем и заполняем наоборот
            if (i < b.length)
                b2[i] =  (b[b.length - i - 1] - '0'); // вычитаем и заполняем наоборот
        }
// вычитаем
        int cr = 0;
        for (int i = 0; i < len; i++) {
            c2[i] =  a2[i] - b2[i]-cr;   // работа с переносом
            cr = 0;
            if (c2[i] < 0) {             // этот блок автоматом отрабатывает все разряды
                c2[i] +=10;               // и перенос
                cr = 1;
            }
        }
        for (int i = 0; i < c2.length; i++) {
            c[len-i-1] = (char) (c2[i] + '0');   // переворачиваем обратно все разряды и переводим в char
        }

        print(c); // выводим на печать  099908

    }



Кода рабочий, сделал максимально близко к C++, чтобы показать алгоритм, вычислительное ядро работает точно.
Специально взяты два числа разной длины.

Это сообщение отредактировал(а) vpf - 5.3.2017, 18:33
PM MAIL IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Levetta
Дата 5.3.2017, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.3.2017

Репутация: нет
Всего: нет



vpf, Спасибо большое smile попробую разобраться))
PM MAIL   Вверх
WiseHoro
Дата 7.3.2017, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.3.2017

Репутация: нет
Всего: нет



Код

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
using namespace std;
char c[10000];
int t = 0;
 
bool mad(vector <int>a, vector <int> b){
    if (a.size() > b.size()){
        return true;
    }
    if (b.size() > a.size()){
        return false;
    }
    int i;
    for (i = a.size() - 1; i >= 0; i--){
        if (a[i] > b[i]){
            return true;
        }
        if (b[i]>a[i]){
            return false;
        }
    }
    return true;
}
vector<int> sam(vector<int>a, vector<int> b){
    int i, u = 0,z, j , p , l , m;
    if (mad(a, b)){
    }else{
        swap(a, b);
        printf("-");
    }
    for (i = 0; i<b.size(); i++){
        a[i] -= b[i];
    }
    for (i = 0; i<a.size(); i++){
        if (a[i]< 0){
            a[i] += 10000;
            for (j = i+1; j<a.size(); j++){
                if (a[j] > 0){
                    a[j] -= 1;
                    break;
                }
                a[j] +=9999;
            }
        }
    }
    while (a.size()>0 && a.back() == 0){
        a.pop_back();
    }
    return a;
}

Вроде, рабочий. Сравнение(mad()) вызывается из функции вычитания(sam()). То, что возвращает sam(), никакого смысла не несет. 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1130 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.