高精度计算

jsc2014 / 2024-07-17 / 原文

1. 高精度乘法

【题目描述】
输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。

【输入】
输入两个高精度正整数M和N。

【输出】
求这两个高精度数的积。

【输入样例】
36
3
【输出样例】
108
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char m[110],n[110];
int a[1000],b[1000],c[1000];

int main()
{
	cin>>m;
	cin>>n;
	
	int alen=strlen(m);
	int blen=strlen(n);
	int clen=0;
	
	for(int i=0;i<alen;i++)
	{
		a[alen-i]=m[i]-'0';
	}
	for(int i=0;i<blen;i++)
	{
		b[blen-i]=n[i]-'0';
	}
	
	for(int i=1;i<=alen;i++)
	{
		for(int j=1;j<=blen;j++)
		{
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	
	clen=alen+blen;
	while(c[clen]==0 && clen>1)
	{
		clen--;
	}
	for(int i=clen;i>=1;i--)
	{
		cout<<c[i];
	}
	return 0;
}

2.大整数加法

【题目描述】
求两个不超过200位的非负整数的和。

【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char arrstring[205],brrstring[205];

int qW(int a,int b)
{
	if(a>=b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
int main()
{
	int len=0;
	cin>>arrstring;
	cin>>brrstring;
	
	len = qW(strlen(arrstring),strlen(brrstring));
	
	int arrint[205]={0};
	int brrint[205]={0};
	int crrint[205]={0};
	int alen=strlen(arrstring);
	int blen=strlen(brrstring);
	
	for(int i=0;i<alen;i++)
	{
		arrint [alen-i]=arrstring[i]-'0';
	}
	for(int i=0;i<blen;i++)
	{
		brrint [blen-i]=brrstring[i]-'0';
	}
	
	for(int i=1;i<=len;i++)
	{
		crrint[i]+=arrint[i]+brrint[i];
		crrint[i+1]=crrint[i]/10;
		crrint[i]=crrint[i]%10;
	}
	
	while(crrint[len+1]==0 && len>0)
	{
		len--;
	}
	
	for(int i=len+1;i>0;i--)
	{
		cout<<crrint[i];
	}
	return 0;
}

3.大整数减法

【题目描述】
求两个大的正整数相减的差。

【输入】
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

【输出】
一行,即所求的差。

【输入样例】
9999999999999999999999999999999999999
9999999999999
【输出样例】
9999999999999999999999990000000000000