实现bign * int 错了无数次
#include<stdio.h>
#include<string.h>
struct bign
{
int ints[10000];
int len;
bign& operator= (char* s)
{
len = strlen(s);
memset(ints, 0, sizeof(ints));
for(int i = 0; i < len; i++)
{
ints[i] = s[len-1-i] - '0';
}
return *this;
}
bign& operator= (int n)
{
char s[10001];
sprintf(s,"%d",n);
*this = s;
return *this;
}
bign()
{
len = 0;
memset(ints, 0, sizeof(ints));
}
bool isempty()
{
return len == 0;
}
bign(char* s)
{
*this = s;
}
bign(int n)
{
*this = n;
}
bool operator > (const bign& b) const
{
if(len > b.len) return true;
else if(len < b.len) return false;
else
{
for(int i = len-1; i >=0; i--)
{
if(ints[i] != b.ints[i])
return ints[i] > b.ints[i];
}
return false;
}
}
bool operator >= (const bign& b) const
{
return !(b > *this);
}
bool operator < (const bign& b) const
{
return b > *this;
}
bool operator <=(const bign& b)const
{
return !(*this > b);
}
bool operator !=(const bign& b)const
{
return *this >b || *this < b;
}
bool operator == (const bign& b)const
{
return *this <= b && *this >= b;
}
bign operator - (const bign& b)const
{
bign res;
if(*this < b) return res;
res = *this;
for(int i = 0; i < len; i++)
{
res.ints[i] -= b.ints[i];
if(res.ints[i] < 0)
{
res.ints[i] +=10;
res.ints[i+1]--;
}
}
int i = res.len -1;
for(;i>=0 && res.ints[i] ==0; i--)
continue;
if(i == -1)
i++;
res.len = i + 1;
return res;
}
//
bign operator* (int n)
{
char s[10010];
sprintf(s,"%d",n);
bign res;
int temp = 0;
int i;
for(i = 0; i < len; i++)
{
temp = n * this->ints[i] + temp;
res.ints[i] = temp%10;
temp /= 10;
}
while(temp >0)
{
res.ints[i++] = temp%10;
temp /= 10;
}
int j;
for(j = len + strlen(s) ; j >=0 && res.ints[j] == 0; j--);
if( j==-1) j++;
res.len = j +1;
/*
printf("from *operator\n");
res.dis();
*/
return res;
}
bign operator/ (const bign& b)const
{
bign res,g;
int i = this->len-1;
for(; i>=0 ;i--)
{
g = g *10;
g.ints[0] = this->ints[i];
while(g >= b)
{
g = g - b;
res.ints[i]++;
}
/*
printf("from / remains\n");
g.dis();
putchar('\n');
*/
}
int j;
for(j = this->len-1; j >=0 && res.ints[j] == 0; j--);
if( j==-1) j++;
res.len = j +1;
return res;
}
bign operator% (const bign& b)const
{
bign res,g;
int i = this->len-1;
for(; i>=0 ;i--)
{
g = g *10;
g.ints[0] = this->ints[i];
while(g >= b)
{
g = g - b;
//res.ints[i]++;
}
}
int j;
for(j = this->len-1; j >=0 && g.ints[j] == 0; j--);
if( j==-1) j++;
g.len = j +1;
return g;
}
void dis()
{
for(int i = 0; i < len; i++)
{
printf("%d", ints[len-1-i]);
}
putchar('\n');
}
};
void eatzero(char* s)
{
int i;
for(i = 0; i < strlen(s) && s[i] =='0'; i++)
continue;
if(strlen(s) == i)
i--;
int len =0;
for(int j =i; j < strlen(s); j++)
{
s[len++] = s[j];
}
s[len] = '\0';
//printf("%s\n", s);
}
int main()
{
freopen("input.txt","r",stdin);
char first[10100];
char sec[10100];
char sign;
while(scanf("%s %c %s",first,&sign,&sec)==3)
{
eatzero(first);
eatzero(sec);
bign f = first;
//f.dis();
bign s = sec;
//s.dis();
bign temp;
if(sign == '/')
temp = f/s;
else temp = f % s;
temp.dis();
}
}