Клас надвеликих чисел
Далі приведений вихідний код файлів програми, яка забезпечує роботу з багаторозрядними (значно більше 10) числами. Ми створимо клас, що може містити до 1000 десяткових розрядів. При цьому числа зберігаються у вигляді рядків.
//заголовочний файл для класу надвеликих чисел
//verylong.h
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int SZ=1000; //максимальне число розрядів
class verylong
{
private:
char vlstr[SZ];//число як рядок
int vlen;//довжина рядка
verylong multdigit(const int) const; //прототипи
verylong mult10(const verylong) const;//прихованих функцій
public:
verylong():vlen(0) //конструктор без аргументів
{vlstr[0]='\0';}
verylong(const char s[SZ]) //конструктор з 1 аргументом для рядка
{strcpy(vlstr,s); vlen=strlen(s);}
verylong(const unsigned long n) //конструктор з 1 аргументом для long int
{ltoa(n,vlstr,10); //перетворити в рядок
strrev(vlstr); //перевернути
vlen=strlen(vlstr); //знайти довжину
}
void putvl() const; //вивести число
void getvl(); //одержати число від користувача
verylong operator +(const verylong); //додати числа
verylong operator *(const verylong); //помножити числа
};
Програма 29.2
//verylong.cpp
//реалізація обробки даних
#include "verylong.h"
//////////
void verylong::putvl() const
{char temp[SZ];
strcpy(temp,vlstr); //створити копію
cout<<strrev(temp); //перевернути копію і вивести її
}
/////////
void verylong::getvl()
{cin>>vlstr;//одержати рядок від користувача
vlen=strlen(vlstr);//знайти її довжину
strrev(vlstr);//перевернути її
}
//////////////
verylong verylong::operator +(const verylong v)
{char temp[SZ];
int j,maxlen;
maxlen=(vlen>v.vlen)?vlen:v.vlen;//знайти довше число
int carry=0;
for(j=0;j<maxlen;j++)
{int d1=(j>vlen-1)?0:vlstr[j]-'0';
int d2=(j>v.vlen-1)?0:v.vlstr[j]-'0';
int digitsum=d1+d2+carry;
if(digitsum>=10)
{digitsum-=10;carry=1;}
else
carry=0;
temp[j]=digitsum+'0';
}
if(carry==1)
temp[j++]='1';
temp[j]='\0';
return verylong(temp);
}
////////////
verylong verylong::operator *(const verylong v)
{verylong pprod;
verylong tempsum;
int j,digit,k;
for(j=0;j<v.vlen;j++) //для кожного розряду аргументу
{digit=v.vlstr[j]-'0';
pprod=multdigit(digit);
for(int k=0;k<j;k++)
pprod=mult10(pprod);
tempsum=tempsum+pprod;
}
return tempsum;
}
///////////
verylong verylong::mult10(const verylong v)const //домноження аргументу на 10
{char temp[SZ];
int j;
for(j=v.vlen-1;j>=0;j--)//зсунутися на 1 розряд
temp[j+1]=v.vlstr[j];
temp[0]='0'; //обнулити молодший розряд
temp[v.vlen-1]='\0';//поставити обмежувач рядка
return verylong(temp);
}
/////////
verylong verylong::multdigit(const int d2) const
{char temp[SZ];
int j,carry=0;
for(j=0;j<vlen;j++)
{int d1=vlstr[j]-'0';
int digitprod=d1*d2;
digitprod+=carry;
if(digitprod>=10)
{carry=digitprod/10;
digitprod-=carry*10;}
else
carry=0;
temp[j]=digitprod+'0';
}
if(carry!=0)
temp[j++]=carry+'0';
temp[j]='\0';
return verylong(temp);
}
Програма 29.3
//обчислення факторіалу великого числа
#include «verylong.h»
#include<conio.h>
int main()
{
unsigned long numb,j;
verylong fact=1;
cout<<”\n\nVvedit chyslo: “;
cin>>numb;
for(j=numb;j>0;j--)
fact=fact*j;
cout<<”Factorial=”;
fact.putvl();
cout<<endl;
getch();
return 0;
}
Програма 29.4
Дата добавления: 2015-08-26; просмотров: 602;