C语言实现大数相乘
(1)在科学研究或者其他的统计中,很多时候会遇到非常大的数字,这时候就需要用到大数相加的方法来进行相加。(所给数超过了long long 的范围)
(2)数字太大会造成溢出问题
(1)大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储数
(2)创建len1和len2作为字符串数组的大小,len3=len1+len2作为位数之和
(3)将字符串数组转换为对应的整数
(4) 两个大数,从末尾开始逐位相乘。相乘结果保存在另外一个数组里面(也从数组末尾开始依次往前保存)
(5)判断进位,将保存位置大于9的数进行进位处理。
(6)还原为字符串数组,再次倒序使其变为原有顺序后输出
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void add(char a[],char b[],char c[])
{
int len1,len2,len3;
int m,n,o,p,q,s,t,i,r;
len1 = strlen(a);
len2 = strlen(b);
len3 = len1 + len2;
for (m = 0;m < len1;m ++) //把字符串数组转换为对应的整数
{
a[m] -= 48;
}
for (n = 0;n < len2;n ++) //把字符串数组转换为对应的整数
{
b[n] -= 48;
}
for (i = 0;i <= len1;i ++)
{
for (q = 0;q <= len1;q ++)
{
c[i+q] += a[i] * b[q] % 10; //相乘取余放在当前位
c[i+q+1] += a[i] * b[q] / 10; //如果还有数,存入下一位
for (r = i + q;r < len3;r ++)
{
if (c[r] > 9) //进位(这里小优化了一下算法,
{ //没有使用计数器)
c[r] -= 10;
c[r+1] ++;
}
}
}
}
for (t = 0;t < len3;t ++) //还原每一位,成为字符串数组
{
c[t] += 48;
}
if (c[len3-1] == '0') //头位如果是零,不打印该位
{
c[len3-1] = 0;
}
}
void swap(char d[]) //倒叙函数
{
int j,k;
for (j = 0;j < strlen(d) / 2;j ++)
{
k = d[j]; //交换
d[j] = d[strlen(d)-1-j];
d[strlen(d)-1-j] = k;
}
}
int main()
{
char a[10000]; //创建数组,定义大小
char b[10000];
char c[10000]={};
gets(a);
gets(b);
swap(a); //数组倒序
swap(b); //数组倒序
add(a,b,c);
swap(c); //重新倒序使其变为原有顺序
puts(c); //输出
system("pause"); //暂停程序
return 0;
}