高精度乘法

在打oj时,总会有些数字大小超过范围,但又要对其进行陈发运算,如100位乘以100位,对于已有的数据类型不足以支持运算,这时就要借助字符串来进行运算

#include <iostream>
#include <cstring> 
#define N 10000 
using namespace std;
void multi (char*a, char* b, int len1, int len2)
{	
    int dm; 
    int num1[N]={0}; 
	int num2[N]={0}; 
	int ans[2*N]={0},i,j;                             //num1,num2储存两个乘数,ans存储结果 
	for (i=0; i<len1; i++) num1[i]=a[len1-i-1]-'0';     //将字符变数字 
	for (j=0; j<len2; j++) num2[j]=b[len2-j-1]-'0';
	for (i=0; i<len1; i++)
	{
		dm=0;                   //需要进位的位数 
		for (j=0; j<len2; j++)
		{
			//i+j 是应为第i位数乘以第j位数,其结果会在第i+j位数上体现。 
			//如100*10时,两个1相乘时,i=2,j=1,结果个位数位1,在第3位。 
			ans[i+j]+=num1[i]*num2[j];
			ans[i+j]+=dm;            //加上进位数   
			dm=ans[i+j]/10;          //保留进位数 
			ans[i+j]%=10;            //保留该数的个位数(即在该位上的数) 
		}
		ans[i+len2]+=dm;            //每遍循环后的进位 
	}
	
	int index=len1+len2;            //理想中最大位数 
	while (index>0 && ans[index]==0) index--;   //除去前面的0
	for (i=index; i>=0; i--) cout<<ans[i];
	cout<<endl;
}
char a[N],b[N];
int main(int argc, char** argv) {
	cin>>a; cin>>b;
	int len1=strlen(a);
	int len2=strlen(b);
	multi(a,b,len1,len2);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值