大数相乘

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值