时隔一年多,整除还是写的磕磕巴巴的
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
using std::string;
using std::max;
const int maxn = 1000;
class bign
{
public:
int len, s[maxn];
bign()
{
memset(s, 0, sizeof(s));
len = 1;
}
bign operator = (const char * num)
{
memset(s, 0, sizeof(s));
len = strlen(num);
for(int i = 0; i < len; ++i)
s[i] = num[len-1-i] - '0';
return *this;
}
bign operator = (int num)
{
char s[maxn];
sprintf(s, "%d", num);
*this = s;
return *this;
}
bign(const char* num)
{
*this = num;
}
bign(int num)
{
*this = num;
}
string str() const
{
string res = "";
for(int i = 0; i < len; ++i)
res = (char)(s[i]+'0') + res;
if(res == "")
res = "0";
return res;
}
bign operator + (const bign& b) const
{
bign c;
c.len = 0;
int g = 0;
for(int i = 0; i < max(len, b.len)+1; ++i)
{
int x = g+s[i]+b.s[i];
c.s[c.len++] = x%10;
g = x/10;
}
if(!c.s[c.len-1])
--c.len;
return c;
}
bign operator - (const bign& b) const
{
bign c;
c.len = 0;
int g = 0;
//suppose *this => b
for(int i = 0; i < len; ++i)
{
if(s[i] - b.s[i] + g < 0)
{
c.s[c.len++] = s[i] - b.s[i] + g + 10;
g = -1;
}
else
{
c.s[c.len++] = s[i] - b.s[i] + g;
g = 0;
}
}
for(int i = c.len-1; i >= 0; --i)
{
if(!c.s[i])
c.len--;
else
break;
}
if(!c.len)
c.len = 1; //when c.s is all 0
return c;
}
bign operator * (const bign& b) const
{
bign c;
c.len = 0;
for(int pos = 0; pos < maxn; ++pos)
{
//pay attention to where i starts from
for(int i = max(pos-len+1, 0); (pos-i >=0) && (i < b.len); ++i)
{
c.s[pos] += s[pos-i] * b.s[i];
//if(s[pos-i] * b.s[i])
//printf("s b.s (%d, %d): %d %d\n", pos-i, i, s[pos-i], b.s[i]);
}
c.s[pos+1] += c.s[pos]/10;
c.s[pos] %= 10;
//if(c.s[pos+1] || c.s[pos])
// printf("c.s.pos+1 c.s.pos (%d, %d): %d %d\n", pos+1, pos, c.s[pos+1], c.s[pos]);
}
int start;
for(start = maxn-1; start >= 0 && !c.s[start]; --start);
if(start == -1)
c.len = 1; //all zero
else
c.len = start+1;
return c;
}
void print()
{
string str = this->str();
printf("%s,len:%d\n", str.c_str(), this->len);
}
bool operator < (const bign & b) const
{
if(len != b.len) return len < b.len;
for(int i = len-1; i >= 0; --i)
{
if(s[i] != b.s[i]) return s[i] < b.s[i];
}
return false;
}
bool operator > (const bign & b) const
{
return (b < *this);
}
bool operator <= (const bign & b) const
{
return !(*this > b);
}
bign operator / (const bign & divisor) const
{
//interger division
bign quotient;
bign remainder = 0;
for(int pos = len-1; pos >= 0; pos--)
{
remainder = remainder * bign(10) + s[pos];
int digit;
for(digit = 0; digit < 10; ++digit)
{
if(bign(digit) * divisor <= remainder && bign(digit+1) * divisor > remainder)
{
break;
}
}
quotient.s[pos] = digit;
remainder = remainder - bign(digit) * divisor;
}
int start;
for(start = maxn-1; start >= 0 && !quotient.s[start]; --start);
if(start == -1)
quotient.len = 1; //all zero
else
quotient.len = start+1;
return quotient;
}
};
int main()
{
char num1[100];
char num2[100];
bign op1, op2, op3;
printf("test add:\n");
while(scanf("%s %s", num1, num2) == 2)
{
op1 = num1, op2 = num2;
op3 = op1 + op2;
op3.print();
}
printf("test minus:\n");
while(scanf("%s %s", num1, num2) == 2)
{
op1 = num1, op2 = num2;
op3 = op1 - op2;
op3.print();
}
printf("test multiple:\n");
while(scanf("%s %s", num1, num2) == 2)
{
op1 = num1, op2 = num2;
op3 = op1 * op2;
op3.print();
}
printf("test divide:\n");
while(scanf("%s %s", num1, num2) == 2)
{
op1 = num1, op2 = num2;
op3 = op1 / op2;
op3.print();
}
}