Клас надвеликих чисел

Далі приведений вихідний код файлів програми, яка забезпечує роботу з багаторозрядними (значно більше 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; просмотров: 593;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.01 сек.