Курсовая работа: Реализация класса больших чисел
}
big1.vect = rasn;
return big1;
}
else
{
for (int i = big2.vect.size() – 1, j = big1.vect.size() – 1; j >=0; i–, j–)
{
if ((big2.vect.at(i) – big1.vect.at(j) + temp) >= 0)
{
rasn.push_front (big2.vect.at(i) – big1.vect.at(j) + temp);
temp = 0;
}
else
{
rasn.push_front (big2.vect.at(i) – big1.vect.at(j) + 10 + temp);
temp = -1;
}
metka = i;
}
for (int i = metka-1; i >= 0; i–)
{
rasn.push_front (abs((big2.vect.at(i)+temp+10)%10));
if ((temp == -1) && (big2.vect.at(i) + temp) < 0) temp = -1; else temp = 0;
}
big2.vect = rasn;
return big2;
}
}
// _______________________ Произведение больших чисел _____________
BigInteger proisvedenie (BigInteger big1, BigInteger big2)
{
BigInteger proisv;
proisv.vect.push_back(0);
BigInteger reserv;
BigInteger reserv2;
for (int i = big1.vect.size() – 1, count = 0; i >= 0; i –, count++)
{
if (big1.vect.at(i) == 0) {} // умножение на 0
else
if (big1.vect.at(i) == 1) // умножение на 1, просто прибавляем число с «добитыми» нулями
{
reserv2.vect = big2.vect;
for (int k = 0; k < count; k++) // добиваем нулями в зависимости от разряда умножения
reserv2.vect.push_back(0);
proisv = summa (reserv2, proisv);
}
else
{
int temp = 0;
for (int k = 0; k < count; k++) // добиваем нулями
reserv.vect.push_front(0);
for (int j = big2.vect.size() – 1; j >=0; j–) // умножаем первое число на «цифру» из разряда учитывая temp
{
reserv.vect.push_front((big1.vect.at(i)*big2.vect.at(j) + temp)%10);
if ((big1.vect.at(i)*big2.vect.at(j) + temp) >=10) temp = (big1.vect.at(i)*big2.vect.at(j) + temp)/10; else temp = 0;
}
if (temp!=0) reserv.vect.push_front(temp); // при увеличении разрядов числа
proisv = summa (reserv, proisv); // складываем предыдущие результаты
reserv.vect.clear();
}
}
if (big1.znak!= big2.znak)
proisv.znak = '-';
return proisv;
}
// __________________ Возведение в степень большого числа _________
BigInteger stepen (BigInteger big, int steps)
{
BigInteger step;
//deque<int> step = deque<int>();
step.vect = big.vect; // постоянный множитель
for (int i = 1; i < steps; i++) // число шагов равное степени
big = proisvedenie (big, step);
if (steps% 2 == 0)
big.znak = ' ';
return big;
}
// __________________ Факториал большого числа ____________________
BigInteger faktorial (BigInteger big)
{
big.znak = ' ';
BigInteger fak;
fak.vect.push_back(1);
BigInteger edinica;
edinica.vect.push_back(1); // для уменьшения на 1
{
while (big.vect.size()!= 0 && big.vect.at(0)!= 0) // пока число не стало равным 0
{
fak = proisvedenie (big, fak);
big = rasnost (big, edinica);
big = dell_null(big);
fak = dell_null(fak);
}
}
return fak;
}
// __________________ Деление больших чисел _______________________
BigInteger delenie (BigInteger delimoe, BigInteger delitel)
{
BigInteger chastnoe;
BigInteger ostatok;
BigInteger reserv2;
BigInteger reserv3;
reserv2.vect = delitel.vect;
for (int i = 0; i < (int) delimoe.vect.size(); i++)
{
ostatok = dell_null(ostatok);
ostatok.vect.push_back (delimoe.vect.at(i)); // промежуточный остаток
if (sravnenie (ostatok, delitel) == -1) {chastnoe.vect.push_back(0);} // пока промежуточный остаток больше делителя пишем в частное 0
else
{
for (int j = 0; j < 10; j++) // цикл, формирующий цифры частного
{
if (sravnenie (ostatok, reserv2) == -1) // промежуточный остаток меньше делителя*j
{
chastnoe.vect.push_back(j);
ostatok = rasnost (ostatok, reserv3);
reserv2.vect = delitel.vect;
break;
}
if (sravnenie (ostatok, reserv2) == 0) // промежуточный остаток кратный делителю
{
chastnoe.vect.push_back (j+1);
ostatok.vect.clear();
reserv2.vect = delitel.vect;
break;
}
reserv3 = reserv2;
reserv2 = summa (reserv2, delitel); // прибавляем сам делитель, пока не станет больше остатка
}
}
} // цифры делимого заканчиваются и остаток меньше делимого, цикл завершается
if (delimoe.znak!= delitel.znak) chastnoe.znak = '-';
return chastnoe;
}
// __________________ Остаток от деления больших чисел ____________
BigInteger ostatok_delenie (BigInteger delimoe, BigInteger delitel)
{ // все как в методе delenie(), только возвращаем не частное, а остаток
BigInteger chastnoe;
BigInteger ostatok;
BigInteger reserv2;
BigInteger reserv3;
reserv2.vect = delitel.vect;
for (int i = 0; i < (int) delimoe.vect.size(); i++)
{
ostatok = dell_null(ostatok);
ostatok.vect.push_back (delimoe.vect.at(i));
if (sravnenie (ostatok, delitel) == -1) {chastnoe.vect.push_back(0);}
else
{
for (int j = 0; j < 10; j++)
{
if (sravnenie (ostatok, reserv2) == -1)
{
chastnoe.vect.push_back(j);
ostatok = rasnost (ostatok, reserv3);
reserv2.vect = delitel.vect;
break;
}
if (sravnenie (ostatok, reserv2) == 0)
{
chastnoe.vect.push_back (j+1);
ostatok.vect.clear();
reserv2.vect = delitel.vect;
break;
}
reserv3 = reserv2;
reserv2 = summa (reserv2, delitel);
}
}
}
if (ostatok.vect.size() == 0) ostatok.vect.push_back(0);
return ostatok;
}
// _________ Метод для использования выражений для вычисления _____
BigInteger vichislenie()
{
BigInteger big1;
BigInteger big2;
string temp = «0123456789»;
string snaki = «-+*/%!^»;
string str;
cin >> str; // считываем строку и в зависимости от знака выбираем действие с числами через switch
int perekluchatel = -1;
if (str.at(0) == snaki.at(0)) big1.znak = '-';
for (int i = 0; i < (int) str.length(); i++)
{
for (int j = 0; j < 10; j++)
{
if ((perekluchatel == -1) && (str.at(i) == temp.at(j))) {big1.vect.push_back(j); break;}
if ((perekluchatel!= -1) && (str.at(i) == temp.at(j))) {big2.vect.push_back(j); break;}
}
if (perekluchatel == -1)
for (int j = 0; j < 7; j++)
{
if ((str.at(i) == snaki.at(j)) && (i!= 0))
{
perekluchatel = j;
if (perekluchatel == 5) break;
if (str.at (i+1) == snaki.at(0)) big2.znak = '-'; break;
}
}
}
cout << str << «=»;
switch(perekluchatel)
{
case 0:
{
return rasnost (big1, big2); break;
}
case 1:
{
return summa (big1, big2); break;
}
case 2:
{
return proisvedenie (big1, big2); break;
}
case 3:
{
return delenie (big1, big2); break;
}
case 4:
{
return ostatok_delenie (big1, big2); break;
}
case 5:
{
return faktorial(big1); break;
}
case 6:
{
BigInteger edinica;
edinica.vect.push_back(1);
BigInteger dvoika;
dvoika.vect.push_back(2);
BigInteger step;
step.vect = big1.vect;
BigInteger tempbig2;
tempbig2.vect = big2.vect;
big2.znak = ' ';
while (big2.vect.size()!= 0 && big2.vect.at(0)!= 1)
{
big1 = proisvedenie (big1, step);
big2 = rasnost (big2, edinica);
big2 = dell_null(big2);
}
BigInteger proverka = ostatok_delenie (tempbig2, dvoika);
if (proverka.vect.at(0) == 0)
big1.znak = ' ';
return big1;
break;
}
}
}
};
Листинг 2. Файл Main.cpp
#include <clocale>
#include «BigInteger.h» // подключаем класс больших целых чисел
void main() // функция использующая большие целые числа
{
setlocale (LC_CTYPE, «Russian»);
BigInteger bint1;
BigInteger bint2;
BigInteger summ;
BigInteger rasn;
BigInteger proisv;
BigInteger step;
BigInteger fak;
BigInteger chastnoe;
int x, y; // переключатели режима вычисления
bool flag = true;
cout << «Выберите режим вычисления:\n1 – режим выражения\n2 – режим выбора операции\n ->»;
cin >> y;
if (y == 1)
{
cout << «Введите выражение для вычисления:\n»;
while (true)
{
BigInteger resultat;
resultat = resultat.vichislenie();
resultat.vector_print(resultat);
cout << endl;
}
}
else
{
cout << «Введите первое число:»;
bint1 = bint1.chtenie();
cout << «Введите второе число:»;
bint2 = bint2.chtenie();
while (flag == true)
{
cout << «\n\nВведите номер операции: \n»;
cout << «1 – сложение чисел \n»;
cout << «2 – разность чисел \n»;
cout << «3 – умножение чисел \n»;
cout << «4 – деление чисел \n»;
cout << «5 – остаток от деления чисел \n»;
cout << «6 – возведение в степень \n»;
cout << «7 – факториал \n»;
cout << «8 – ввести новые числа\n»;
cout << «9 – выйти из программы\n»;
cout << «->»;
cin >> x;
switch(x)
{
case 1:
{
cout << «\nСумма чисел:»;
summ = summ.summa (bint1, bint2);
summ.vector_print(summ);
break;
}
case 2:
{
cout << «\nРазность чисел:»;
rasn = rasn.rasnost (bint1, bint2);
rasn.vector_print(rasn);
break;
}
case 3:
{
cout << «\nПроизведение чисел:»;
proisv = proisv.proisvedenie (bint1, bint2);
proisv.vector_print(proisv);
break;
}
case 4:
{
cout << «\nДеление чисел:»;
chastnoe = chastnoe.delenie (bint1, bint2);
chastnoe.vector_print(chastnoe);
break;
}
case 5:
{
cout << «\nОстаток от деления чисел:»;
chastnoe = chastnoe.ostatok_delenie (bint1, bint2);
chastnoe.vector_print(chastnoe);
break;
}
case 6:
{
int st;
cout << «Введите в какую степень нужно возвести первое число:»;
cin >> st;
cout << «\n» << st <<» – ая степень числа:»;
step = step.stepen (bint1, st);
step.vector_print(step);
break;
}
case 7:
{
cout << «\nФакториал первого числа:»;
fak = fak.faktorial(bint1);
fak.vector_print(fak);
break;
}
case 8:
{
bint1 = BigInteger();
cout << «\nВведите первое число:»;
bint1 = bint1.chtenie();
bint2 = BigInteger();
cout << «Введите второе число:»;
bint2 = bint2.chtenie();
break;
}
case 9:
{
flag = false;
break;
}
default:
{
cout << «\nОшибка ввода, повторите процедуру!»;