33,311
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
typedef struct BigNum_
{
int len;
int data[1005];
int sign;
} BigNum;
void Zero(BigNum* num)
{
int i = 0;
int* data = num->data;
for (i = 0; i < 1000; ++i) data[i] = 0;
num->sign = 1;
}
void Rev(char* a)
{
char t;
char* b = a;
while (*b++);
b-=2;
while (a<b) t = *a, *a=*b, *b = t, ++a, --b;
}
void ToBigNum(BigNum* num, char* str)
{
int len = 0;
int index = 0;
int token;
int base;
int* data = num->data;
if (*str=='-') num->sign = -1, str++;
else num->sign = 1;
Rev(str);
while (*str)
{
token = 0;
base = 1;
while (*str&&index++<4) token = token+base*(*str++-'0'), base*=10;
index = 0;
data[len++] = token;
}
if (len == 0) data[0]=0, num->len = 1;
else num->len=len;
}
void Print(BigNum* it)
{
int curr = it->len-1;
if (it->sign == -1) printf("-");
if (curr < 0) printf("0");
else
{
if (curr>=0) printf("%d", it->data[curr--]);
while (curr>=0) printf("%04d", it->data[curr--]);
}
puts("");
}
char str_buff[2][1000];
BigNum a, b, t, result;
int temp[1000];
int sub(int* buff, int hi, int lo, int* buff1, int hi1, int lo1, int it)
{
int i, j, k, l = hi1+1;
int inc = 0;
int hi2;
#ifdef TEST
printf("subtest\t%d\t%d\t%d\t%d\n", hi, lo, hi1, lo1);
#endif
for (i = lo1; i <= hi1 +5; ++i) temp[i] = 0;
for (i = lo1; i <= hi1; ++i)
{
int k = it * buff1[i] + inc;
temp[i] = k % 10000;
inc = k / 10000;
}
if (inc) temp[l++] = inc;
hi2 = l - 1;
while (buff[hi] == 0 && hi >= lo) -- hi;
if (l > hi - lo + 1) return 0;
if (hi - lo == hi2 - lo1)
for (i = hi, j = hi2; i >= lo; --i, --j)
{
#ifdef TEST
printf("cmp\t%d\t%d\n", buff[i], temp[j]);
#endif
if(buff[i] < temp[j]) return 0;
if (buff[i] > temp[j]) break;
}
for (i = lo1, j = lo; i <= hi2; ++i,++j)
{
#ifdef TEST
printf("sub\t%d\t%d\n", buff[j], temp[i]);
#endif
if (buff[j] >= temp[i]) buff[j]-= temp[i];
else
{
while (buff[j] < temp[i]) buff[j] += 10000, --buff[j+1];
buff[j] -= temp[i];
}
}
return 1;
}
void Div(BigNum* result, BigNum* a, BigNum* b)
{
int la = a->len;
int lb = b->len;
int lr = la - lb + 1;
int curr = lr - 1;
int hia = la - 1;
int loa = curr;
int hib = lb - 1;
int lob = 0;
int* abuff = a->data;
int* bbuff = b->data;
int* rbuff = result->data;
/*确定curr位上的商*/
for (;curr>=0;--curr)
{
int test;/*试商*/
#ifdef TEST
printf("%d\t%d\n%d\t%d\n", hia, loa, hib, lob);
#endif
/*除数至少有两位*/
if (lb > 1)
{ /*被除数中所要考虑的位数大于除数的位数*/
if (hia-loa>hib-lob)
{
test = (abuff[hia]*10000 + abuff[hia-1]) / bbuff[hib];
}
else/*被除数中所要考虑的等于大于除数的位数*/
{
/*printf("test\t%d\t%d\n", abuff[hia]*10000 + abuff[hia-1], bbuff[hib]*10000 + bbuff[hib-1]);*/
test = (abuff[hia]*10000 + abuff[hia-1]) / (bbuff[hib]*10000 + bbuff[hib-1]);
}
}
else
{
if (hia-loa+1>1)
{
test = (abuff[hia]*10000 + abuff[hia-1]) / bbuff[hib];
}
else
{
/*printf("test\t%d\t%d\n", abuff[hia]*10000 + abuff[hia-1], bbuff[hib]*10000 + bbuff[hib-1]);*/
test = abuff[hia]/bbuff[hib];
}
}
#ifdef TEST
printf("%d\n", test);
#endif
for( ; test > 0; --test)
{
if(sub(abuff, hia, loa, bbuff, hib, lob, test))
{
break;
}
}
if (abuff[hia] == 0) -- hia;
--loa;
#ifdef TEST
printf("use%d\n", test);
#endif
rbuff[curr] = test;
}
/*首位为零*/
curr = lr - 1;
while (result->data[curr] == 0) --curr;
result->len = curr + 1;
result->sign = a->sign * b->sign;
}
int main(void)
{
while (scanf("%s%s", str_buff[0], str_buff[1])==2)
{
ToBigNum(&a, str_buff[0]);
ToBigNum(&b, str_buff[1]);
Zero(&result);
Div(&result, &a, &b);
Print(&result);
}
return 0;
}
http://d.download.csdn.net/down/403510/hqin6