一个无聊的高精度计算器
废话不多说,直接上代码
#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);
}
}
}
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));
}
}
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);
}
}
}
}