大数除法(高精度除法)解题日记 (c++源代码)

date:20100612

一开始用模拟除法写了一个,用到了加法,减法,乘法,本来还打算用二分法进行优化的,可惜程序一直没有调试对。我暂时解决不了。

 

今天用除法当减法来算。。写了一个程序。。两个数相近。。还好。。相差太远,程序跑得实在是太久了。

刚想了另一个算法。回去试试。

下面给我今天晚上写的除法。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一段C语言大数除法代码: ``` #include <stdio.h> #include <string.h> #define MAX_DIGITS 1000 int dividend[MAX_DIGITS], divisor[MAX_DIGITS], quotient[MAX_DIGITS], remainder[MAX_DIGITS]; void divide(int dividend[], int divisor[], int quotient[], int remainder[]) { int i, j; int dividend_len = strlen(dividend); int divisor_len = strlen(divisor); for (i = 0; i < dividend_len; i++) { remainder[i] = dividend[i] - '0'; } int remainder_len = dividend_len; while (remainder_len > 0 && remainder[remainder_len - 1] == 0) { remainder_len--; } if (remainder_len < divisor_len) { quotient[0] = 0; return; } int shift = remainder_len - divisor_len; for (i = divisor_len - 1; i >= 0; i--) { divisor[i + shift] = divisor[i]; } for (i = 0; i < shift; i++) { divisor[i] = 0; } divisor_len = remainder_len; while (shift >= 0) { int d = 0; while (d < 10 && memcmp(divisor, remainder, divisor_len) <= 0) { d++; for (i = divisor_len - 1; i >= 0; i--) { remainder[i + 1] = remainder[i]; } remainder_len++; remainder[0] = 0; for (i = 0; i < divisor_len; i++) { remainder[i] += divisor[i]; if (remainder[i] > 9) { remainder[i] -= 10; remainder[i + 1]++; } } } quotient[shift] = d - 1; for (i = 0; i < divisor_len; i++) { remainder[i] -= divisor[i]; if (remainder[i] < 0) { remainder[i] += 10; remainder[i + 1]--; } } while (remainder_len > 0 && remainder[remainder_len - 1] == 0) { remainder_len--; } shift--; } } int main() { char dividend_str[MAX_DIGITS]; char divisor_str[MAX_DIGITS]; printf("Enter dividend: "); scanf("%s", dividend_str); printf("Enter divisor: "); scanf("%s", divisor_str); divide(dividend_str, divisor_str, quotient, remainder); printf("Quotient: "); int i = MAX_DIGITS - 1; while (i > 0 && quotient[i] == 0) { i--; } for (; i >= 0; i--) { printf("%d", quotient[i]); } printf("\n"); printf("Remainder: "); i = MAX_DIGITS - 1; while (i > 0 && remainder[i] == 0) { i--; } for (; i >= 0; i--) { printf("%d", remainder[i]); } printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值