一个无聊的高精度计算器
  • 板块灌水区
  • 楼主XMZ0906
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/9 09:24
  • 上次更新2024/7/9 10:53:22
查看原帖
一个无聊的高精度计算器
1121650
XMZ0906楼主2024/7/9 09:24

一个无聊的高精度计算器

废话不多说,直接上代码

#include<bits/stdc++.h>
using namespace std;
const int con=3000010;
char a1[con],b1[con],w,u;
int a[con],b[con],c[con];
 
 
void print(int a[]);                              
void init(){
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));	 
}
void turn(char a1[],int a[]){
	a[0]=strlen(a1);
    for(int i=1;i<=a[0];i++)a[i]=a1[strlen(a1)-i]-'0';
}
void cpy(int a[],int b[]){
	for (int i=0; i<=b[0];i++){
        a[i]=b[i];
    }
}
int judge(int a[]){
	
	for(int i=a[0];i>0;i--){
		if(a[i]!=0){
			return 1;
		}
		if(a[i]>'9'||a[i]<'0'){
				return 0;
	            cout<<"数据错误"<<endl;
		}
	}
	cout<<"数据错误"<<endl;
    return 0;
}
int compare(int a[],int b[]){
	if(a[0]>b[0])return 1;
	if(a[0]<b[0])return -1;
	for(int i=a[0];i>0;i--){
		if(a[i]>b[i])return 1;
	    if(a[i]<b[i])return -1;
	}
	return 0;
}
void numcpy(int p[],int q[],int d){
	for(int i=1;i<=p[0];i++)q[i+d-1]=p[i];
	q[0]=p[0]+d-1;
}
void add(int a[],int b[],int c[]){
	
	c[0]=max(a[0],b[0]);
	int r=0;
	for(int i=1;i<=c[0];i++){
		c[i]=(a[i]+b[i]+r)%10;
		r=(a[i]+b[i]+r)/10;
	}
	if(r){
		c[0]++;
		c[c[0]]=r;
	}
}
void subtract(int a[],int b[],int c[]){
	
	int i=1;
	while(i<=a[0]||i<=b[0]){
		if(a[i]<b[i]){
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];
		i++;
	}
	c[0]=i;	
}
void subtracts(int a[],int b[]){
	int f;
	f=compare(a,b);
	if(f==0){
		a[0]=0;
		return;
	}
	if(f==1){
		for(int i=1;i<=a[0];i++){
			if(a[i]<b[i]){
				a[i+1]--;
				a[i]+=10;
			}
			a[i]-=b[i];
		}
		while(a[0]>0&&a[a[0]]==0)a[0]--;	
	}
}
void Multiply(int a[],int b[],int c[]){
	int x; 
	
	for(int i=1;i<=a[0];i++){
		x=0;
		for(int j=1;j<=b[0];j++){
			c[i+j-1]+=a[i]*b[j]+x;
			x=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
		c[i+b[0]]=x;
	}
	c[0]=a[0]+b[0];
}
void Divide(int a[],int b[],int c[]){
	
	int t[10001];
	c[0]=a[0]-b[0]+1;
	for(int i=c[0];i>0;i--){
		memset(t,0,sizeof(t));
		numcpy(b,t,i);
		while(compare(a,t)>=0){
			c[i]++;
			subtracts(a,t);
		}	
	}
}//除完后c为商,a为余数 
void Power(int a[],int b[],long long bb,int c[]){
	int ww[5]={1,1};
	add(b,ww,b);
	
	for(long long i=bb;i>0;i--){
		Multiply(b,a,c);
		cpy(b,c);
	    memset(c,0,sizeof(c));	
	}
}//算完之后结果为b 
void print(int a[]){
	while(c[0]>0&&c[c[0]]==0)c[0]--;
	if(a[0]==0){
		cout<<0<<endl;
		return;
	}
	while(!a[a[0]])a[0]--;
	for(int i=a[0];i>0;i--)cout<<a[i];
	cout<<endl;
}
int main(){

	while(1){
		cin>>u;
		if(u=='c'){
			init();	
			cin>>a1;
			turn(a1,a);		
		}else if(u=='a'){
		    print(a);
	    	memset(b,0,sizeof(b));
			memset(c,0,sizeof(c));	
		}
		
		cin>>w;
    	if(w=='+'){
    		cin>>b1;
    		turn(b1,b);
    		if(judge(b)==1&&judge(a)==1){
    			add(a,b,c);
    			cout<<"和是:";
    				print(c);
    				memset(a,0,sizeof(a));
	    			cpy(a,c);
			}
		}else if(w=='-'){
				cin>>b1;
			
			turn(b1,b);
			if(judge(b)==1&&judge(a)==1){
				subtract(a,b,c);
				cout<<"差是:";
				print(c);
				memset(a,0,sizeof(a));
	    		cpy(a,c);
			}
		}else if(w=='*'){
			cin>>b1;
			turn(b1,b);
			if(judge(b)==1&&judge(a)==1){
				Multiply(a,b,c);
				cout<<"积是:";
				print(c);
				memset(a,0,sizeof(a));
	    	    cpy(a,c);	
			}
		
		}else if(w=='/'){
			cin>>b1;
			turn(b1,b);
			if(judge(b)==1&&judge(a)==1){
				Divide(a,b,c);
				cout<<"商是:";
				print(c);
				cout<<"余是:";
				print(a);
				memset(a,0,sizeof(a));
	     		cpy(a,c);
			}
		}else if(w=='^'){
			long long bb;
			cin>>bb;
			if(judge(a)==1){
				Power(a,b,bb,c);
				cout<<"结果是:";
				print(b);
				memset(a,0,sizeof(a));
	    	    cpy(a,b);	
			}
		}
   	}	
}	
2024/7/9 09:24
加载中...