#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 行