大数类(加减乘除)

大数类的运算 其实就模拟我们小学学的加减乘除

分析:我们都把字符串转化成int 数组比较好做

1. 加法

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

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

【输出】

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

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	
	string a,b;
	cin>>a>>b;
	int cnt=0;
	for(int i=0;i<a.length();i++){
		if(a[i]=='0') cnt++;
		else break;
	}
	a=a.substr(cnt);
	cnt=0;
	for(int i=0;i<b.length();i++){
		if(b[i]=='0') cnt++;
		else break;
	}
	b=b.substr(cnt);
	int len1=a.length();
	int len2=b.length();
	if(len2>len1) swap(a,b),swap(len1,len2);
	string s;
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int t=0;
	for(int i=0;i<len1;i++){
		int x=0;
		if(i<len2) x+=b[i]-'0';
		x+=a[i]-'0'+t;
		t=(x/10);
		x=x%10;
		s.push_back(x+'0');
	}
	if(t!=0) s.push_back(t);
	reverse(s.begin(),s.end());
	cout<<s<<endl;
	return 0;
}

2.大数减法

【题目描述】

求两个大的正整数相减的差。

【输入】

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

【输出】

一行,即所求的差。

【输入样例】

9999999999999999999999999999999999999
9999999999999

【输出样例】

9999999999999999999999990000000000000
#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a,b;
	cin>>a>>b;
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int len1=a.length(),len2=b.length();
	vector<int>v1(len1),v2(len1);
	for(int i=0;i<len1;i++) v1[i]=a[i]-'0';
	for(int i=0;i<len2;i++) v2[i]=b[i]-'0';
	vector<int>vec;
	for(int i=0;i<len1||i<len2;i++){
		if(v1[i]<v2[i]){
			v1[i]+=10;
			v1[i+1]--;
		}
		vec.push_back(v1[i]-v2[i]); 
	}
	int cnt=vec.size()-1;
	//去除高位的0  同时至少保留一位最低位 
	while(cnt>=1&&vec[cnt]==0) cnt--;
	for(int i=cnt;i>=0;i--){
		cout<<vec[i];
	}
	cout<<endl; 
	return 0;
 } 

 3.大数乘法

【题目描述】

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

【输入】

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

【输出】

求这两个高精度数的积。

【输入样例】

36
3

【输出样例】

108
#include<bits/stdc++.h>
#define MAX 105
char a[MAX],b[MAX];
int x[MAX+10],y[MAX+10],z[MAX*2+10];
int main()
{
    int len1,len2,i,j;
    while(~scanf("%s %s",a,b))
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(z,0,sizeof(z));
        len1=strlen(a);
        len2=strlen(b);
        for(j=0,i=len1-1;i>=0;i--)
            x[j++]=a[i]-'0';
        for(j=0,i=len2-1;i>=0;i--)
            y[j++]=b[i]-'0';
        for(i=0;i<len1;i++)
        {
            for(j=0;j<len2;j++)
                z[i+j]=z[i+j]+x[i]*y[j];
        }
        for(i=0;i<MAX*2;i++)
        {
            if(z[i]>=10)
            {
                z[i+1]=z[i+1]+z[i]/10;
                z[i]=z[i]%10;
            }
        }
        for(i=MAX*2;i>0;i--)
        {
            if(z[i]==0)
                continue;
            else
                break;
        }
        for(;i>=0;i--)
            printf("%d",z[i]);
        printf("\n");
    }
    return 0;
}

 

 4 高精度与低精度的除法

大数类(加减乘除)

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	cin>>s;
	int x;
	cin>>x;
	vector<int>vec;
	for(int i=0;i<s.length();i++){
		vec.push_back(s[i]-'0');
	} 
	int r=0;//余数 
	vector<int>vv;
	for(int i=0;i<vec.size();i++){
		r=r*10+vec[i];
		if(r<x){
			vv.push_back(0);
		}
		else{
			vv.push_back(r/x);
			r=r%x;
		}
	}
	int cnt=0;
	//去除高位0 同时至少保留一位最低位 
	while(cnt<vv.size()-1&&vv[cnt]==0) cnt++;
	for(int i=cnt;i<vv.size();i++){
		cout<<vv[i];
	}
	cout<<endl;
	return 0;
}