俺求个大数除法。。。。。

elmnd 2009-01-07 07:51:00
1。 带注解
2。 用数组或者链表存放的大数
3。 最好输入2个大数的部分封装一下, 而不是已经赋初值。
4。 不要混乱代码。。。
...全文
208 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
guowei6229067 2009-11-23
  • 打赏
  • 举报
回复
好想看
neeestth 2009-01-08
  • 打赏
  • 举报
回复
就呆在云上 2009-01-08
  • 打赏
  • 举报
回复
ding!
viprs 2009-01-07
  • 打赏
  • 举报
回复
mark!
viprs 2009-01-07
  • 打赏
  • 举报
回复
mark!
「已注销」 2009-01-07
  • 打赏
  • 举报
回复
mark
chen_de_sheng 2009-01-07
  • 打赏
  • 举报
回复
http://enjoy-math.equn.com/index.htm - -|||
chen_de_sheng 2009-01-07
  • 打赏
  • 举报
回复
http://enjoy-math.equn.com/Programs/BigInt.txt
chen_de_sheng 2009-01-07
  • 打赏
  • 举报
回复
http://enjoy-math.equn.com/Math/Mathematical/Inverse.htm
先用牛顿法求倒数,再做乘法。
baihacker 2009-01-07
  • 打赏
  • 举报
回复
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;

l前缀表示len,也就是说a 是被除数,b是除数,r是结果(result)

loa 到 hia的部分除以lob 到hib的部分 商放在curr处

/*除数至少有两位*/
此注释以下在进行试商,分了一些情况在讨论,代码可以更简化的.


int sub(int* buff, int hi, int lo, int* buff1, int hi1, int lo1, int it)

这个函数表示

buff从lo到hi的位置表示的数 - (buff1从lo1到hi1的位置表示的数) * it

如果能减尽的话,执行减法,并返回1.
否则返回0.

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];
}
}
执行减法
baihacker 2009-01-07
  • 打赏
  • 举报
回复
#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;
}
太乙 2009-01-07
  • 打赏
  • 举报
回复
ps:满足lz的所有要求~
太乙 2009-01-07
  • 打赏
  • 举报
回复
http://d.download.csdn.net/down/403510/hqin6

俺以前写的,很糙!将就看吧!嘿嘿~~
keven1868 2009-01-07
  • 打赏
  • 举报
回复
-_-!
太乙 2009-01-07
  • 打赏
  • 举报
回复
http://d.download.csdn.net/down/403510/hqin6
帅得不敢出门 2009-01-07
  • 打赏
  • 举报
回复
up
xiaoyisnail 2009-01-07
  • 打赏
  • 举报
回复
先mark

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧