高精度加减乘除

其实都是模拟人常规的加减乘除方法。

加:
数组输入,翻转对齐,对位相加,进位处理

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXN 10000
int a1[MAXN],b1[MAXN];
char a[MAXN],b[MAXN];
int main(){
	int len2,len1,i,j;
	while(scanf("%s",a)!=EOF){//数组输入
		scanf("%s",b);
		len1=strlen(a);
		len2=strlen(b);
		j=0;
		for(i=len1-1;i>=0;i--)//翻转对齐
			a1[j++]=a[i]-'0';
		j=0;
		for(i=len2-1;i>=0;i--)
			b1[j++]=b[i]-'0';
		for(i=0;i<max(len1,len2);i++)//对位相加
			a1[i]+=b1[i];
		int flag=0; //进位处理
		for(i=0;i<=max(len1,len2);i++){
			a1[i]+=flag;
			flag=a1[i]/10;
			a1[i]%=10;
		}
		flag=a1[max(len1,len2)];
		for(i=max(len1,len2)+flag-1;i>=0;--i)
			cout<<a1[i];
		cout<<endl;
		memset(a1,0,sizeof(a1));
		memset(b1,0,sizeof(b1));
	}
	return 0;
}

减:
数组输入,翻转对齐,对位相减,退位处理

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAXN 10000
int  a1[MAXN],b1[MAXN];
char a[MAXN],b[MAXN];
int main(){
	int len2,len1,i,j;
	while(scanf("%s",a)!=EOF){//数组输入
		scanf("%s",b);
		len1=strlen(a);
		len2=strlen(b);
		j=0;
		for(i=len1-1;i>=0;i--)//翻转对齐
			a1[j++]=a[i]-'0';
		j=0;
		for(i=len2-1;i>=0;i--)
			b1[j++]=b[i]-'0';
		for(i=0;i<max(len1,len2);i++)//对位相减
			a1[i]-=b1[i];
		int flag=0; //退位处理
		for(i=0;i<max(len1,len2)-1;i++){
			a1[i]-=flag;
			if(a1[i]<0)
			{
				flag=1;
				a1[i]+=10;
			}
			else flag=0;
		}
		flag=a1[max(len1,len2)-1];
		for(i=flag==0?max(len1,len2)-2:max(len1,len2)-1;i>=0;--i)
			cout<<a1[i];
		cout<<endl;
		memset(a1,0,sizeof(a1));
		memset(b1,0,sizeof(b1));
	}
	return 0;
}

乘:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define MAXN 10000
int  a1[MAXN],b1[MAXN],a11[MAXN];
char a[MAXN],b[MAXN];
int main(){
	int len2,len1,i,j,k,t;
	while(scanf("%s",a)!=EOF){//数组输入
		scanf("%s",b);
		len1=strlen(a);
		len2=strlen(b);
		int num=0;j=0;	
		for(i=len1-1;i>=0;i--){
			num++;
			a1[j]=a1[j]+(a[i]-'0')*pow(10,num-1);
			if(num==4)
			{
				j++;
				num=0;
			}
		}
		if(len1%4==0)
			len1=j;
		else len1=j+1;
		num=0;j=0;	
		for(i=len2-1;i>=0;i--){
			num++;
			b1[j]=b1[j]+(b[i]-'0')*pow(10,num-1);
			if(num==4)
			{
				j++;
				num=0;
			}
		}
		if(len2%4==0)
			len2=j;
		else len2=j+1;
		for(i=0;i<len1;i++)
			for(j=0;j<len2;j++)
				a11[i+j]=a11[i+j]+a1[i]*b1[j];
		int flag=0;
		for(i=0;i<len1+len2;i++){
			a11[i]+=flag;
			flag=a11[i]/10000;
			a11[i]%=10000;
		}
		t=len1+len2-1;
		flag=a11[t];
		while(!flag){
			t--;
			flag=a11[t];
		} 
		cout<<a11[t];
		for(i=t-1;i>=1;--i)
			printf("%04d",a11[i]);
		if(t!=0){
			if(len1+len2-2==0&&flag==0) cout<<a11[0];
			else printf("%04d",a11[0]);
		}
		cout<<endl;
		memset(a1,0,sizeof(a1));
		memset(b1,0,sizeof(b1));
		memset(a11,0,sizeof(a11));
	}
	return 0;
}

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int ans[210],a[210],b[210],n,lena,lenb,lenans,jian[210],tmp[210];
char a1[210],b1[210];
void func(char a[],int b[]){//处理
    for(int i=0;i<strlen(a);i++){
        b[i]=a[i]-'0';
    }
}
bool check(int a[],int b[]){//是否可再减
	for(int i=0;i<lenb;i++){
		if(a[i]<b[i]){
			return false;
		}
		if(a[i]>b[i]){
			return true;
		}
	}
	return true;
}
int Minus(int a[],int b[]){//把除法当减法做
	for(int i=0;i<lenb;i++){
		tmp[i]=a[i];
	}
	int ti=0;
	while(true){
		if(!check(tmp,b)){
			break;
		}
		ti++;//减了一次
		for(int i=0;i<lenb;i++){
			tmp[i]-=b[i];
		}
		for(int i=lenb-1;i>0;i--){
			if(tmp[i]<0){
				tmp[i]+=10;
				tmp[i-1]--;
			}
		}
		for(int i=0;i<lenb;i++){
			a[i]=tmp[i];
		}
	}
	return ti;
}
int main(){
    cin>>n;
    getchar();
    while(n--){
    	lenans=0;
        memset(a1,0,sizeof(a1));
        memset(a,0,sizeof(a));
        memset(b1,0,sizeof(b1));
        memset(b,0,sizeof(b));
        memset(ans,0,sizeof(ans));
        scanf("%s%s",&a1,&b1);
        lenb=strlen(b1);
        lena=strlen(a1);
        func(a1,a);
        func(b1,b);
		while(lenans+lenb<=lena){
			memset(jian,0,sizeof(jian));
			for(int i=lenans,j=0;j<lenb;j++,i++){
				jian[j]=a[i];
			} 
			ans[lenans]=Minus(jian,b);
			for(int i=lenans,j=0;j<lenb;j++,i++){
				a[i]=jian[j];
			}
			a[lenans+1]+=a[lenans]*10;
			lenans++;
			for(;lenans+lenb<=lena;lenans++){
				if(a[lenans]!=0){
					break;
				} 
			} 
		}
		if(lenans==0){
			cout<<0<<endl;
		}
		else{
			int i=0;
			for(i=0;i<lenans;i++){
				if(ans[i]){
					break;
				}
			}
			for(;i<lenans;i++){
				cout<<ans[i];
			}
			cout<<endl;
		}
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值