高精度计算器
#include<iostream> #include<cstdlib>//c语言中的系统库 #include<cstring> using namespace std; void print(int a[]){ if(a[0]<=0){ cout<<0<<endl; return; } for(int i=a[0];i>=0;i--) cout<<a[i]; cout<<endl; return; //函数执行完毕回到主程序 } string jian(string a,string b)//减法 { string s; int a1[101]={},b1[101]={}; int lena=a.length(),lenb=b.length(); int x=0; for(int i=0;i<lena;i++)a1[i]=char(a[lena-1-i])-'0'; for(int i=0;i<lenb;i++)b1[i]=char(b[lenb-1-i])-'0'; for(int i=0;i<lena;i++) { if(a1[i]<b1[i]){ a1[i+1]--; a1[i]+=10; } a1[i]-=b1[i]; } while(lena>0&&a1[lena-1]==0)lena--; for(int i=lena-1;i>=0;i--)s+=a1[i]+'0'; if(s.length()==0)return "0"; return s; } int cmp(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; } int chujian(int a[],int b[])//除法中的减法 { if(cmp(a,b)==0) return a[0]=0,0; for(int i=1;i<=a[0];i++) { if(a[i]<b[i]){ a[i+1]--; a[i]=a[i]+10; } a[i]-=b[i]; } while(a[0]>0&&a[a[0]]==0)a[0]--; return 0; } int numcpy(int a[],int b[],int det)// 除法中复制a到b { for(int i=1;i<=a[0];i++) { b[i+det-1]=a[i]; } b[0]=a[0]+det-1; return 0; } int chugao(int a[],int b[],int c[])//除法 { int tmp[201]={}; c[0]=a[0]-b[0]+1; for(int i=a[0];i>0;i--) { memset(tmp,0,sizeof(tmp));//修改部分 将sizeof(int) 改为 sizeof(tmp); numcpy(b,tmp,i); while(cmp(a,tmp)>=0) { c[i]++; chujian(a,tmp); } } while(c[0]>0&&c[c[0]]==0)c[0]--; return 0; } string chu(string a,string b)//除法初始化 { if(a=="0")return "0"; string s; int a1[101]={},b1[101]={},c1[101]={}; a1[0]=a.length(),b1[0]=b.length(); c1[0]=a1[0]-b1[0]+1; int x=0; for(int i=1;i<=a1[0];i++)a1[i]=char(a[a1[0]-i])-'0'; for(int i=1;i<=b1[0];i++)b1[i]=char(b[b1[0]-i])-'0'; chugao(a1,b1,c1); for(int i=c1[0];i>0;i--)s+=c1[i]+'0';//修改部分 将c1[c[0]]改为 c1[i] return s; } string jia(string a,string b)//加法 { string s; int a1[101]={},b1[101]={},c1[101]={}; int lena=a.length(),lenb=b.length(),lenc; lenc=lena>lenb?lena:lenb; int x=0; for(int i=0;i<lena;i++)a1[i]=char(a[lena-1-i])-'0'; for(int i=0;i<lenb;i++)b1[i]=char(b[lenb-1-i])-'0'; for(int i=0;i<lenc;i++) { c1[i]=a1[i]+b1[i]+x; x=c1[i]/10; c1[i]%=10; } if(x)c1[lenc++]=x; for(int i=0;i<lenc;i++)s+=c1[lenc-1-i]+'0'; if(s.length()==0)return "0"; return s; } string cheng (string a,string b) //乘法 { if(a=="0"||b=="0")return "0"; string s; int a1[101]={},b1[101]={},c1[101]={}; int lena=a.length(),lenb=b.length(); int lenc=lena+lenb; int x=0; for(int i=0;i<lena;i++)a1[i]=char(a[lena-i-1])-'0'; for(int i=0;i<lenb;i++)b1[i]=char(b[lenb-i-1])-'0'; for(int i=0;i<lenb;i++) { x=0; for(int j=0;j<lena;j++) { c1[i+j]+=b1[i]*a1[j]+x; x=c1[i+j]/10;//取进位 c1[i+j]%=10;//取个位 } if(x)c1[i+lena]+=x; } while(c1[lenc-1]==0)lenc--; for(int i=0;i<lenc;i++) s+=c1[lenc-1-i]+'0'; return s; } int help()//查看所有命令 { cout<<"-----------------------------" <<endl; cout<<"help 查看命令"<<endl; cout<<"cls 清空屏幕"<<endl; cout<<"print_s 打印计算结果"<<endl; cout<<"mspaint 打开画图软件"<<endl; cout<<"+ 加法"<<endl; cout<<"- 减法 " <<endl; cout<<"* 乘法法 " <<endl; cout<<"/ 除法 " <<endl; cout<<"-----------------------------" <<endl; } int is_gao(string a)//判断是否是高精度数字 { for(int i=0;i<a.length();i++) if(char(a[i])>'9'||char(a[i])<'0') return 0; return 1; } string jisuan(string cmd,string s)//s为之前计算的结果 { string a,f,b;//a,b存储高精度,f存储符号 if(cmd=="+"||cmd=="-"||cmd=="*"||cmd=="/")//如果命令为符号,就在s的基础上运算 { a=s,f=cmd; cin>>b; if(is_gao(b)==0) { cout<<"格式错误"<<endl; return s; } } else{ //如果cmd不是高精度数字,就不能运算 a=cmd; if(is_gao(a)==0) { cout<<"命令错误"<<endl; return s; } cin>>f; if(f!="+"&&f!="-"&&f!="*"&&f!="/"){ cout<<"符号错误"<<endl; return s; } cin>>b; if(is_gao(b)==0) { cout<<"格式错误"<<endl; return s; } } if(f=="*") {s=cheng(a,b);cout<<s<<endl;return s;} if(f=="+") {s=jia(a,b);cout<<s<<endl;return s;} if(f=="/"){s=chu(a,b);cout<<s<<endl;return s;} if(f=="-"){s=jian(a,b);cout<<s<<endl;return s;} } int main() { string cmd; cout<<"命令行高精度计算器"<<endl; help(); string s="0";//存储计算的结果 while(1)//每次循环输出一个命令,按命令执行 { cin>>cmd; if(cmd=="cls")system("cls");// 使用cls命令 else if(cmd=="mspaint")system("mspaint");// 使用cls命令 else if(cmd=="help")help(); else if(cmd=="print_s")cout<<s<<endl; else {//其中 cmd ==a s=jisuan(cmd,s); } //if(cmd=="*") { string a,b; cin>>a>>b; cout<<cheng(a,b); } } return 0; } //修改部分:第77 行,第100 行