HugeInt

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* code for long mathematics */
/* Kim Slava KarKtl 2009 */
/* (c) Don't copy :) */
/*
-------------------------------------------------------------------------
Some documentation:
* code is homemade :)
* if code isn't extrafast, it means I could do any more
* one book helped me whith code
* www.agolist.manual.ru - my favourite site of algorithms
* to change countsystem and array size change constants BASE and ARRAYSIZE
* using functions are like : changingnumber.function(usingnamber), first
one will be changed
--------------------------------------------------------------------------
*/
/*<---code starts here--->*/
#include <iostream>
#include <string>
using namespace std;
#define BASE 10 //in which system will be numbers used
#define ARRAYSIZE 100 //how much elements are in one array
class H {
public:
H();
//general==v
void enter ();
short read (int i);
void print ();
//math actions==v
void plus (H);
void minus (H);
void multiply (H);
void divide (H);
void mod (H);
//math using short numbers==v
void smul (long long);
void sdiv (long long);
//
short body[ARRAYSIZE];
private:
short size;
};
H::H(){
for(int i=0;i<ARRAYSIZE;i++){
body[i]=0;
}
size=0;
}
void H::enter () {
int j,i;
const int strsize=1000;
char str[strsize];
cin>>str;
size=strlen(str);
for(j=0,i=strlen(str)-1;j<strlen(str),i>=0;j++,i--){
body[j]=(int)str[i]-48;
}
}
short H::read (int i=-1){
if(i=-1)return size;
else return body[i];
}
void H::print () {
for(int i=size-1;i>=0;i--){
cout<<body[i];
}
}
void H::plus (H second){
if(second.read()>size)size=second.read();
for(int i=0;i<ARRAYSIZE;i++){
body[i]+=second.body[i];
if(body[i]>=BASE){body[i]-=BASE;body[i+1]++;}
}
if(body[size]!=0)size++;
}
void H::minus (H second) {
if(second.read()>size)size=second.read();
for(int i=0;i<ARRAYSIZE;i++){
body[i]-=second.body[i];
if(body[i]<=BASE){body[i]+=BASE;body[i+1]--;}
}
if(body[size-2]==0)size--;
}
void H::multiply (H second){
short tarr[ARRAYSIZE]={0},tsize;
bool chsize=0;
for (int ib=0;ib<second.read();ib++){ //each number from second
for (int ia=0;ia<size;ia++){ //each number from first
tarr[ia+ib]+=body[ia]*second.body[ib]; //multiplying to temporary array tarr
if(tarr[ia+ib]>=BASE){
int temp=tarr[ia+ib]%BASE;
tarr[ia+1+ib]+=(tarr[ia+ib]-temp)/BASE;
tarr[ia+ib]=temp; //if element is bigger than 10
}
tsize=ia+ib; //is array size changed? He looks for it!
}
}
size=tsize+1;
for (int i=0;i<size;i++){ //copying from temporary to permanent
body[i]=tarr[i];
}
}
void H::divide (H second){
int left=0;
}
void H::smul (long long b){
ulong i, temp;
const short *a=A.Coef;
short *c=C.Coef, carry=0;
for (i=0; i<A.Size;i++) {
temp = body[i]*B + carry;
carry = temp / BASE;
c[i] = temp - carry*BASE; // с[i] = temp % BASE
}
if (carry) {
c[i] = carry;
C.Size = A.Size+1;
}
else C.Size = A.Size;
}
int main () {
H a,b;
a.enter();
a.print();
b.enter();
b.print();
cout<<endl;
a.plus(b);
a.print();
return 0;
}
/*<--code ends here-->*/
/* code for long mathematics */
/* Kim Slava KarKtl 2009 */
/* (c) Don't copy :) */