大数运算(1)——大数储存

C/C++:

C/C++中没有存储大数(精度超过long型)的数据类型,而大数精度一般是少则数十位,多则几万位。一般我们称这种C/C++基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?

基本方法是:用数组或字符串存放和表示大整数。一个数组或字符串元素,存放大整数中的一位。

例如:

大数:1545485785212454510

用字符串进行大数的储存后,若进行运算,可以根据ASCII表中字符串元素对应的ASCII值减去0的ASCII值进行运算。

例如:字符串中a[0]='4',其ASCII值是52,0的ASCII值是48,用52减去48正好是数字4。

Java:

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

其构造器类型如下:
BigDecimal(int):       创建一个具有参数所指定整数值的对象。 
BigDecimal(double):创建一个具有参数所指定双精度值的对象,不推荐使用。
BigDecimal(long):    创建一个具有参数所指定长整数值的对象。 
BigDecimal(String):  创建一个具有参数所指定以字符串表示的数值的对象,推荐使用。

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的需求,我为您编写了一个计算大数阶乘的 C 语言代码,代码如下所示: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DIGITS 50 void multiply(int* a, int* b, int* result) { int carry = 0; for (int i = 0; i < MAX_DIGITS; i++) { int tmp = a[i] * b[i] + carry; result[i] = tmp % 10; carry = tmp / 10; } } void printBigNumber(int* a) { int i = MAX_DIGITS - 1; while (i > 0 && a[i] == 0) i--; for (int j = i; j >= 0; j--) { printf("%d", a[j]); } printf("\n"); } int main() { int n; scanf("%d", &n); int* num = (int*) malloc(MAX_DIGITS * sizeof(int)); int* tmp = (int*) malloc(MAX_DIGITS * sizeof(int)); int* result = (int*) malloc(MAX_DIGITS * sizeof(int)); for (int i = 0; i < MAX_DIGITS; i++) { num[i] = tmp[i] = result[i] = 0; } num[0] = tmp[0] = result[0] = 1; for (int i = 2; i <= n; i++) { multiply(num, tmp, result); for (int j = 0; j < MAX_DIGITS; j++) { num[j] = result[j]; } for (int j = 0; j < MAX_DIGITS; j++) { tmp[j] = 0; } for (int j = 0; j < i; j++) { tmp[j] = num[j]; } } printf("%d! = ", n); printBigNumber(num); return 0; } ``` 这个程序使用了一个包含 50 个元素的数组来存储大数,每个数组元素存储大数中的一位数字。程序中的 `multiply` 函数用于计算两个大数的乘积,`printBigNumber` 函数用于输出大数,`main` 函数则是程序的主入口,用于计算大数阶乘并输出结果。 在程序中,我们首先读入了一个整数 `n`,然后使用 `num` 数组来存储当前的大数,使用 `tmp` 数组来存储中间结果,使用 `result` 数组来存储最终结果。我们将 `num` 数组初始化为 1,然后逐步计算 `n!`,每次循环都将 `num` 数组与 `tmp` 数组进行乘法运算,将结果存储到 `result` 数组中,并将 `result` 数组赋值给 `num` 数组,以便下一次循环使用。最后,我们使用 `printBigNumber` 函数将计算得到的大数输出到控制台。 请注意,由于计算 `n!` 的结果会非常大,因此在程序中需要使用一个大数数组来存储结果。此外,由于 C 语言中的整数类型无法存储大数,因此我们需要使用数组来模拟大数存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值