高精度计算

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
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char astring[200],bstring[200];
int main()
{
	cin>>astring>>bstring;
	int aint[200]={0};
	int bint[200]={0};
	int cint[200]={0};
	int alen=strlen(astring);
	int blen=strlen(bstring);
	
	for(int i=0;i<alen;i++)
	{
		aint[alen-i]=astring[i]-'0';
	}
	for(int i=0;i<blen;i++)
	{
		bint[blen-i]=bstring[i]-'0';
	}
	for(int i=1;i<=alen;i++)
	{
		if(aint[i]<bint[i])
		{
			aint[i+1]--;
			aint[i]+=10;
			cint[i]=aint[i]-bint[i];
		}
		else
		{
			cint[i]=aint[i]-bint[i];
		}
	}
	
	while(cint[alen+1]==0)
	{
		alen--;
	}
	
	for(int i=alen+1;i>0;i--)
	{
		cout<<cint[i];
	}
	return 0;
}

4.高精除

【题目描述】
高精除以高精,求它们的商和余数。

【输入】
输入两个低于300位的正整数。

【输出】
输出商和余数。

【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337
#include<bits/stdc++.h>
using namespace std;
char achar[305],bchar[305];
int alen,blen;
int aint[305];
int bint[305];
int cint[305];
bool cmp(int x)  
{
    if(aint[x+blen]>0)   
	{
            return true;
    }
    for(int i=blen;i>=1;i--)  
	{
        if (aint[x+i-1]<bint[i]) 
		{
            return false;
        }
		else if (aint[x+i-1]>bint[i])
		{
            return true;
        }
    }
    return true;
}
int main()
{
    cin>>achar>>bchar;
    alen=strlen(achar);
    blen=strlen(bchar);
    
    for (int i=0;i<alen;i++)      
	{
        aint[alen-i]=achar[i]-'0';
    }
    for (int i=0;i<blen;i++)
	{
        bint[blen-i]=bchar[i]-'0';
    }
    
    for(int i=alen-blen+1;i>=1;i--)   
	{                                          
        while(cmp(i))  
		{
            cint[i]++;
            for(int j=1;j<=blen;j++)  
			{
                if (aint[i+j-1]>=bint[j]) 
				{
                    aint[i+j-1]-=bint[j];
                }
				else 
				{
                    aint[i+j]--;
                    aint[i+j-1]+=10-bint[j];
                }
            }
        }
    }
    
    
    bool flag=1;
    bool y=0;
    for (int i=alen;i>=1;i--)  
	{
        if (flag==0||cint[i]>0)   
		{
            cout<<cint[i];
            flag=0;
            y=1;
        }
    }
    if(y==0) cout<<0;
    
     
    cout<<endl;
    flag=1;
    y=0;
    for (int i=alen;i>=1;i--)  
	{
        if (flag==0||aint[i]>0) 
		{
            cout<<aint[i];
            flag=0;
            y=1;
        }
    }
    if (y==0) cout<<0;
    
    return 0;
}
posted @ 2024-07-17 18:06  jsc2014  阅读(72)  评论(0)    收藏  举报