Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 16:00   #1
Ker_33rus
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 46
По умолчанию Длинная арифметика в действии...помогите исправить ошибку

Код:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#define DMAX 100
typedef int thuge[DMAX];
using namespace std;



int main(int argc, char *argv[])
void add(thuge &a, thuge &b)
{

//функция прибавляет к числу a число b

      if (a[0] < b[0]) a[0] = b[0];

//складывать нужно до размера большего числа

      int r = 0;

/*r - обозначает сколько у нас "в уме"

при сложение младших цифр в уме у нас 0*/

      for(int i = 1; i <= a[0]; ++i) {

            a[i] += b[i] + r;

            //сумма очередных цифр и переноса

            if (a[i] >= 10) {

            //случай, когда происходит перенос в следующий разряд

                  r = 1;

                  a[i] -= 10;

            } else {

            //случай, когда переноса не происходит

                  r = 0;

            }

      }

      //если после сложения остался еще перенос, то нужно добавить еще одну цифру

      if (r > 0) {

            a[0]++;

            a[a[0]] = r;

      }

}
   void subtract(thuge &a, thuge &b) {

     //функция вычитает из числа a число b

     //r - обозначает был ли заем единицы из текущего разряда

           int r = 0;

     //заем из младшего разряда отсутствует

           for(int i = 1; i <= a[0]; ++i) {

                 a[i] -= b[i] + r;

                 //разность очередных цифр с учетом заема

                 if (a[i] < 0) {

                 //случай, когда происходит заем из следующего разряда

                       r = 1;

                       a[i] += base;

                 } else {

                 //случай, когда заем не происходит

                       r = 0;

                 }

           }

           /*Разность может содержать меньше цифр, 

           поэтому нужно при необходимости уменьшить количество цифр*/

           while (a[0] > 1 && a[a[0]] == 0) {

                 --a[0];

           }

     }

int compare(thuge &a, thuge &b) {

/*

a < b => -1

a > b =>  1

a = b =>  0

*/

//сравнение по количеству цифр

      if (a[0] < b[0]) {

            return -1;

      }

      if (a[0] > b[0]) {

            return 1;

      }

/*сравнение в случае одинакового количества цифр*/

      for(int i = a[0]; i >= 1; --i) {

     if (a[i] < b[i]) {

      return -1;

     }

     if (a[i] > b[i]) {

      return 1;

     }

      }

      return 0;

}

const char * digitFormat = "%.4d";

/*формат вывода числа ровно из 4 цифр,

недостающие цифры дополняются нулями*/

void writeHuge(thuge &a) {

      printf("%d", a[a[0]]);

      for(int i = a[0] - 1; i >= 1; --i) {

            printf(digitFormat, a[i]);

      }

      printf("\n");

}
продолжение ниже
Ker_33rus вне форума Ответить с цитированием
Старый 29.11.2009, 16:01   #2
Ker_33rus
Пользователь
 
Регистрация: 17.10.2009
Сообщений: 46
По умолчанию

Код:
const int digit = 4; 

/*количество цифр в одной ячейке массива*/

void readHuge(thuge &a) {

      char s[DMAX * digit + 1];

      scanf("%s", s);//чтение строки

      memset(a, 0, sizeof(a));

      int len = strlen(s);

      a[0] = (len - 1) / digit + 1;

      /*вычисление количества цифр в нужной системе исчисления*/

      for(int i = 1; i <= a[0]; ++i) {

            /*вычисление iтой цифры*/

            for(int j = digit; j >= 1; --j) {

                  int pos = len - (i - 1) * digit - j;

                  /*вычисление позиции, из которой нужно дописать к iтой цифре. Помните, что массив s индексирован с 0*/

                  if (pos >= 0) {

                        a[i] = a[i] * 10 + (s[pos] - '0');

                  }

            }

      }

}

void multiply(thuge &a, int b) {

//функция умножает число a на короткое число b

//r - обозначает перенос в текущий разряд

      int r = 0;

//перенос в младший разряд отсутствует

      for(int i = 1; i <= a[0]; ++i) {

            a[i] = a[i] * b + r;

            //произведение очередной цифры и короткого числа с учетом переноса в текущий разряд

            r = a[i] / base;

            //вычисление переноса в следующий разряд

            a[i] -= r * base;

            //оставляем только часть произведения меньшую base

      }

      /*Если после умножения остался еще перенос, то нужно добавить еще цифру.

      Может потребоваться добавить несколько цифр, если число b больше base*/

      while (r > 0) {

            a[0]++;

            a[a[0]] = r % base;

            r = r / base;

      }

}
int divide(thuge &a, int b) {

/*функция делит число a на короткое число b и возвращает остаток от деления*/

/*r - обозначает текущий остаток, к которому будет приписана очередная цифра*/

      int r = 0;

//изначально остаток 0

      for(int i = a[0]; i >= 1; --i) {

      /*цикл от старших цифр к младшим*/

            r = r * base + a[i];

            //приписывание очередной цифры

            a[i] = r / b;

            //запись частного в результат

            r %= b;

            //пересчет остатка

      }

      /*Частное может содержать меньше цифр, 

      поэтому нужно при необходимости уменьшить количество цифр*/

      while (a[0] > 1 && a[a[0]] == 0) {

            --a[0];

      }

      return r;

}
void multiply(thuge &a, thuge &b) {

//функция умножает число a на число b

      thuge c;

      memset(c, 0, sizeof(c)); //заполнение массива 0

      /*c - результат умножения. В данном случае нельзя записывать результат в тот же массив.*/

      for(int i = 1; i <= a[0]; ++i) {

        int r = 0, j;

        for(j = 1; j <= b[0] || r > 0; ++j) {

        //пока есть перенос или в b есть еще цифры

         c[i + j - 1] += a[i] * b[j] + r;

         /*при умножении на предыдущие цифры в c уже записано 

            некоторое значение, поэтому нужно прибавлять, а не 

            присваивать*/

            r = c[i + j - 1] / base;

            c[i + j - 1] -= r * base;

        }

      }

      c[0] = a[0] + b[0]; 

     //максимально возможное количество цифр в ответе

      memmove(a, c, sizeof(c)); //переместим ответ в массив a

      //но цифр может оказаться меньше

      while (a[0] > 1 && a[a[0]] == 0) {

            --a[0];

      }
  return EXIT_SUCCESS;
}
Обшибка:
Код:
/home/zaraki/o/src/o.cpp:35: error: expected initializer before 'void'
Ker_33rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
длинная арифметика Dimarik Общие вопросы C/C++ 1 16.09.2009 12:02
Длинная арифметика на C#(деление) Mr_Dark Общие вопросы .NET 1 21.06.2009 21:57
Длинная арифметика: деление Vadik(R) Помощь студентам 1 27.03.2009 12:08
Длинная арифметика DmT Помощь студентам 2 06.10.2007 22:43