C|大数相乘时,整数数据类型位数不够,怎样存储和计算?

当位数超过整数数据类型的两个大数相乘时,大数可以使用字符串存储,模拟手工做乘法的过程(不同的是,先从高位开始),将每一位相乘的结果先不做进位,累加到一个数组对应下标的元素中,最后做进位处理。

以下是模拟过程:

C|大数相乘时,整数数据类型位数不够,怎样存储和计算?

然后将结果数据转换为字符串结果即可输出:

<code>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// 因为大数过长,所以采用字符串存储, 故要将字符串中字符转化为数字
char *BigDataMutliply(char *DataA, char *DataB)
{
int alen = strlen(DataA);
int blen = strlen(DataB);
size_t size = sizeof(int)*(alen + blen);
int *TempResult = (int *)malloc(size);
char *Result = (char *)malloc(sizeof(char)*(alen + blen + 1));
memset(TempResult, 0, size);

for (int i=0 ; i<alen> {
for (int j=0; j<blen> TempResult[i+j+1] += (DataA[i] - '0')*(DataB[j] - '0');// 最高位留出一位,待进位
}
for (i = alen + blen; i >=0; i--) // 处理进位
{
if (TempResult[i] >= 10)
{
TempResult[i - 1] += TempResult[i] / 10;
TempResult[i] %= 10;
}
}
i=0;
while (TempResult[i] == 0) // 删除0的前缀
{
i++;
}
int j;
for(j=0; i < alen + blen + 1; j++, i++)
{
Result[j] = TempResult[i] + '0';
}
Result[j-1] = '\\0'; // 最后位置\\0
return Result;

}
int main()
{

char *A = "111111111";
char *B = "111111111";
char *res = BigDataMutliply(A, B);
printf("res = %s\\n",res); // 12345678987654321
system("pause");
return 0;
}/<blen>/<alen>/<string.h>/<stdlib.h>/<stdio.h>/<code>

-End-


分享到:


相關文章: