Код:
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'