高精度计算器

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

 

posted @ 2022-06-11 16:31  李墨韵  阅读(257)  评论(0编辑  收藏  举报