C++中如何处理超长的数字(long long类型的整数都无法存储的)

这篇具有很好参考价值的文章主要介绍了C++中如何处理超长的数字(long long类型的整数都无法存储的)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++中如何处理超长的数字(long long类型的整数都无法存储的)

在 C++中,如果数字超出了 long long 类型的范围,可以考虑使用字符串或第三方库(如 Boost.Multiprecision)来表示和处理超长数字。要使用第三方库需要下载并安装所需的第三方库,在此就不介绍了。

在此介绍使用字符串表示和处理超长数字。本文将介绍使用C++字符串实现超长的数字加法、减法、乘法和除法运算。

1.判断一个非负的超大数是奇数还是偶数,源码如下:

#include <iostream>  
#include <string>
using namespace std;  

int main() {  
//string s = "123456789123456789123456789";
cout << "请输入一个正整数:" << endl;
    cin >> s;
    // s.size()是字符串的长度,即由多少字符组成的, 字符串的最后一位字符即s[s.size() - 1]
    char c = s[s.size() - 1];
    cout << "最后一位数字是" << c << endl;  
    // 将一个整数数字字符变成整数,我们只需要将它减字符'0'
    int i = c - '0';
    if (i % 2 == 0) {
        cout << s << "是偶数";
    } else {
        cout << s << "是奇数";
    }
        
    return 0;  
}

2.判断两个超大正整数的大小

#include <iostream>  
#include <string>  
  
using namespace std;  
  
bool Lower(string str1, string str2){     
    //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小
    return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} 
  
int main() {  
    cout << "请输入两个超大正整数:" << endl;
	string a, b; 
	cin >> a >> b; 
    if (Lower(a, b)){
    	cout << a << "小于" << b << endl;
	}
	else{
		cout << a << "大于" << b << endl;
	}
	  
    return 0;  
}

下面分别介绍加法、减法、乘法和除法运算的实现方法。特别说明,加减运算仅限非负整数的运算,因为负数的加减运算可以等价为某种形式的加法或者减法运算,故不做考虑;乘除运算只考虑大整数运算,不考虑小数的计算;除法只考虑大整数运算,计算结果精确到6位小数(6位小数后直接舍去)。

参考https://blog.songjiahao.com/archives/382

3. 非负大整数的加法

大数加法的实现,模仿了我们列竖式的计算方法,从个位开始,一位一位的相加,每次考虑进位即可。由于读入的字符串0号位置为最高位,所以我们采用逆序的办法访问字符串,然后每位计算即可。同样的,因为计算时候得到的每一位都是逆序的,最后的结果要进行逆置。

加法,可能导致最终位数多一位(最高位的进位),所以要记得处理。

最后,我们来考虑一些特殊情况,比如两个数字都是0,或者其中有一个是0,我们就可以快速得到结果,省去了遍历过程。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>

using namespace std; 

//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0
    int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入
    for(int i=0;i<size;i++)
        if(str[i]!='0') return false;
    return true;
}

string Add(string str1, string str2){
    //关于0的处理
    if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0
    else if(CheckZero(str1)) return str2;               //如果有个一为0
    else if(CheckZero(str2)) return str1;
    string ans;
    int i=str1.size()-1,j=str2.size()-1;
    int flag=0;                                         //进位标记
    while(i>=0||j>=0||flag){
        int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替
        int numb=j>=0?str2[j--]-'0':0;
        flag=numa+numb+flag;                            //计算两位的和
        ans+='0'+flag%10;                               //取个位保存在答案中
        flag/=10;                                       //计算进位
    }
    reverse(ans.begin(),ans.end());
    return ans;
}

int main(){
	cout << "请输入两个正整数:" << endl;
	string a, b;
	cin >> a >> b;
	string result = Add(a, b);  
    cout << "和:" << result << endl;  
    return 0;  
}

4. 非负大整数的减法

大数减法的实现,也模仿了我们列竖式的计算方法。从个位起,每次计算一位,首先根据后一位是否借位,先减去借位,然后判断当前位是否够减,如果需要借位,则向前一位借位后在减,直到运算完毕。同样的,因为我们要从个位开始计算,所以计算得到的结果必然是逆序的,最终要记得将结果逆置。

减法,可能出现前导0,要记得清除前导零。

最后,我们来考虑一些特殊情况,比如两个数相同或者有一个数字为0,我们可以直接得到结果,从而避免了复杂的处理过程。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>

using namespace std; 

//判断两个超大正整数的大小 
bool Lower(string str1, string str2){     
    //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小
    return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} 

//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0
    int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入
    for(int i=0;i<size;i++)
        if(str[i]!='0') return false;
    return true;
}

string Sub(string str1, string str2){
    //处理0的情况
    if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0
    else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0
    else if(CheckZero(str2)) return str1;                           //如果第二个数字为0
    //定正负
    int negative=0;                     //结果的正负号
    if(Lower(str1,str2)){
        swap(str1,str2);                //保证str1大于str2
        negative=1;                     //如果str1小于str2,则结果过为负值
    }
    string ans;
    int i=str1.size()-1,j=str2.size()-1;//逆序开始处理
    int flag=0;                         //借位标记
    while(i>=0||j>=0){
        int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0
        int numb=j>=0?str2[j--]-'0':0;
        numa-=flag;                     //先减去借位
        if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)
            numa+=10;                   //借位并记录借位
            flag=1;
        }
        else flag=0;                    //如果不借位,则借位标记为0
        ans+='0'+numa-numb;             //计算当前位置并保存
    }
    i=ans.size()-1;
    while(ans[i]=='0') i--;
    ans=ans.substr(0,i+1);              //去除前导0,如111-110=1
    if(negative) ans+='-';              //如果计算结果是负数,添加负数符号
    reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下
    return ans;
}

int main(){
	cout << "请输入两个正整数:" << endl;
	string a, b;
	cin >> a >> b;
	string result = Sub(a, b);  
    cout << "差: " << result << endl;     
    return 0;  
}

5.大整数的乘法

大数乘法的实现,还采用我们竖式计算的方法。从个位开始,每次计算被乘数和乘数一位的积,然后借助我们写好的大数加法实现最终结果的累加。但是大数乘法需要考虑正负的问题,所以需要对正负号进行处理,对两个数的符号使用异或最终可以确定乘积结果的正负。

乘法,因为乘数的每一位都有相应的权值(个十百千万),因此我们对于乘数每一位的积进行运算时要考虑该位置的权值,在积的后边补充相应个数的零即可。

最后,我们考虑一些特殊情况,比如两个数字中只要有一个是0,则结果就是0。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>

using namespace std; 

//判断两个超大正整数的大小 
bool Lower(string str1, string str2){     
    //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小
    return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} 

//判断是否为负,只需要判断第一位是不是负号即可,这里不考虑正号的存在,即认为不使用正号
bool CheckNegative(const string &str){  //检查是否为负数
    return str[0]=='-';
}

//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0
    int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入
    for(int i=0;i<size;i++)
        if(str[i]!='0') return false;
    return true;
}

string Add(string str1, string str2){
    //关于0的处理
    if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0
    else if(CheckZero(str1)) return str2;               //如果有个一为0
    else if(CheckZero(str2)) return str1;
    string ans;
    int i=str1.size()-1,j=str2.size()-1;
    int flag=0;                                         //进位标记
    while(i>=0||j>=0||flag){
        int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替
        int numb=j>=0?str2[j--]-'0':0;
        flag=numa+numb+flag;                            //计算两位的和
        ans+='0'+flag%10;                               //取个位保存在答案中
        flag/=10;                                       //计算进位
    }
    reverse(ans.begin(),ans.end());
    return ans;
}

string Mul(string str1, string str2){
    if(CheckZero(str1)||CheckZero(str2)) return "0";    //如果有一个为0,则结果为0
 
    int negative=0,negastr1=0,negastr2=0;               //定正负
    if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-字符
        negastr1=1; str1=str1.substr(1,str1.size()-1);
    }
    if(CheckNegative(str2)){
        negastr2=1; str2=str2.substr(1,str2.size()-1);
    }
    negative=negastr1^negastr2;                         //异或运算确定结果的正负号
 
    string ans;
    if(Lower(str1,str2)) swap(str1,str2);               //保证str1大于等于str2
    int size1=str1.size(),size2=str2.size();
    for(int i=size2-1;i>=0;i--){                        //遍历较小数字的每一位
        string temp(size2-1-i,'0');                     //temp为str1乘以str2[i]的积,根据str2[i]的权重(个十百千万,补充对应个数的0)
        int flag=0;                                     //进位标记
        for(int j=size1-1;j>=0;j--){                    //temp
            flag+=(str1[j]-'0')*(str2[i]-'0');
            temp.push_back('0'+(flag%10));
            flag/=10;
        }
        if(flag) temp.push_back('0'+flag);              //如果最高位还有进位
        reverse(temp.begin(),temp.end());
        ans=Add(ans,temp);                              //将计算结果累加到最终的结果上
    }
    if(negative) ans="-"+ans;                           //处理结果的正负号
    return ans;
}

int main(){
	cout << "请输入两个整数:" << endl;
	string a, b;
	cin >> a >> b;
	string result = Mul(a, b);  
    cout << "积:" << result << endl;     
    return 0;  
}

6. 大整数的除法,计算结果精确到6位小数(6位小数后直接舍去)

如商3.700014[5800933124]

大数除法的实现,同样采用我们除法式子的方法进行计算。首先,使用异或的方法确定结果的正负号。两个数字相除的时候,如果第一个数字大于等于第二个数字,则结果一定是大于等于1的,否则小于1。于是,为了实现小于1的结果表示,我们为结果精确到小数点后6位。这里采用的方法为:事先确定是否为纯小数,然后在第一个数字的末尾加上6个0,然后使用我们除法式子的方法进行计算。从第一个数字的头部开始,找到第一个长度能够进行商运算的数字开始,计算商并将临时的余数补足一位进行下一位商的计算,直到计算完毕。

除法,可能遇到除数为0的情况,因此需要在计算的时候提前进行判定。另外计算过程中,计算商的方法使用大数的减法操作,因此可能会遇到0堆积的情况(长度增大),会影响到大小的比较判定,要注意处理。

最后,我们考虑一些特殊情况,比如被除数为0的时候,可以直接输出结果0.000000。

实现代码

#include <iostream>  
#include <string>  
#include <algorithm>

using namespace std; 

//判断两个超大正整数的大小 
bool Lower(string str1, string str2){     
    //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小
    return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
} 

//判断是否为负,只需要判断第一位是不是负号即可,这里不考虑正号的存在,即认为不使用正号
bool CheckNegative(const string &str){  //检查是否为负数
    return str[0]=='-';
}

//判断是否为0,全部为0的数字就是0,比如00000
bool CheckZero(const string &str){      //检查是否等于0
    int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入
    for(int i=0;i<size;i++)
        if(str[i]!='0') return false;
    return true;
}

//大数减法
string Sub(string str1, string str2){
    //处理0的情况
    if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0
    else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0
    else if(CheckZero(str2)) return str1;                           //如果第二个数字为0
    //定正负
    int negative=0;                     //结果的正负号
    if(Lower(str1,str2)){
        swap(str1,str2);                //保证str1大于str2
        negative=1;                     //如果str1小于str2,则结果过为负值
    }
    string ans;
    int i=str1.size()-1,j=str2.size()-1;//逆序开始处理
    int flag=0;                         //借位标记
    while(i>=0||j>=0){
        int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0
        int numb=j>=0?str2[j--]-'0':0;
        numa-=flag;                     //先减去借位
        if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)
            numa+=10;                   //借位并记录借位
            flag=1;
        }
        else flag=0;                    //如果不借位,则借位标记为0
        ans+='0'+numa-numb;             //计算当前位置并保存
    }
    i=ans.size()-1;
    while(ans[i]=='0') i--;
    ans=ans.substr(0,i+1);              //去除前导0,如111-110=1
    if(negative) ans+='-';              //如果计算结果是负数,添加负数符号
    reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下
    return ans;
}

string Div(string str1, string str2){
    //处理除数为0的情况和被除数为0的情况
    if(CheckZero(str2)) return "The divisor cannot be zero!";
    else if(CheckZero(str1)) return "0.000000";
 
    int negative=0,negastr1=0,negastr2=0;               //定正负
    if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-
        negastr1=1; str1=str1.substr(1,str1.size()-1);
    }
    if(CheckNegative(str2)){
        negastr2=1; str2=str2.substr(1,str2.size()-1);
    }
    negative=negastr1^negastr2;                         //异或运算确定结果的正负号
 
    int point=0;                                        //结果是否为纯小数
    if(Lower(str1,str2)) point=1;                       //如果str1小于str2,则计算为纯小数
    string ans;                                         //计算结果
    str1+=string(6,'0');                                //补足6个0,用于计算小数位
 
    int size1=str1.size(),size2=str2.size();
    int i=size2-1;                                      //商第一位的位置
    string temp=str1.substr(0,i);                       //从str1上取size2-1个字符
    for(i;i<size1;i++){
        temp+=str1[i];                                  //从后边拿出一位,预先处理可以防止结尾处越界
        int cnt=0;                                      //当前位的商,也就是temp中包含了多少个str2,使用减法                                          //如果temp不为0,则计算商
        while(Lower(str2,temp)||temp==str2){            //如果当前位商不为0,则计算商
            temp=Sub(temp,str2);
            cnt++;
        }
        if(temp=="0") temp.clear();                     //如果某次计算结果为0,则清空,避免0的堆积,比如111000 111
        ans.push_back('0'+cnt);                         //保存商
    }
    i=0;
    while(ans[i]=='0') i++;
    ans=ans.substr(i,ans.size()-i);                     //去除前导0
    if(point){                                          //如果是纯小数,补足6位并添加小数点
        int len=6-ans.size();
        ans="0."+string(len,'0')+ans;
    }
    else ans.insert((ans.end()-6),'.');                 //如果不是小数,则只需要插入小数点       
    if(negative) ans="-"+ans;                           //最后一步骤,如果是负数带上负号
    return ans;
}

int main(){
	cout << "请输入两个整数:" << endl;
	string a, b;
	cin >> a >> b;
	string result = Div(a, b);  
    cout << "商(6位小数后直接舍去):" << result << endl;     
    return 0;  
}

7.最后,整合为大数四则运算

加减运算仅限非负整数的运算,因为负数的加减运算可以等价为某种形式的加法或者减法运算,故不做考虑;乘除运算只考虑大整数运算,不考虑小数的计算;除法只考虑大整数运算,计算结果精确到6位小数(6位小数后直接舍去)。源码如下:

#include <iostream>  
#include <string>  
#include <algorithm>
  
using namespace std;  
  
//大数四则运算,两个参数都不能为空
string Add(string str1, string str2);       //大数加法
string Sub(string str1, string str2);       //大数减法
string Mul(string str1, string str2);       //大数乘法
string Div(string str1, string str2);       //大数除法
bool Lower(string str1, string str2);       //大数比较(小于)
bool CheckZero(const string &str);          //检查是不是0,比如0000认为是0
bool CheckNegative(const string &str);      //检查是不是负数
void ShowMenu();                            //提示菜单
void ShowMenu(char choice);                 //二级菜单
int main(){
    string a,b;
    char ch;
    ShowMenu();
    while(cin>>ch&&ch!='q'){                //循环打印菜单并提示用户输入
        ShowMenu(ch);
        cin>>a>>b;
        switch(ch){
            case 'a':cout<<a<<" + "<<b<<" = "<<Add(a,b)<<endl;break;
            case 'b':cout<<a<<" - "<<b<<" = "<<Sub(a,b)<<endl;break;
            case 'c':cout<<a<<" * "<<b<<" = "<<Mul(a,b)<<endl;break;
            case 'd':cout<<a<<" / "<<b<<" = "<<Div(a,b)<<endl;break;
        }
        ShowMenu();
    }
    return 0;
}
string Add(string str1, string str2){
    //关于0的处理
    if(CheckZero(str1)&&CheckZero(str2)) return "0";    //如果都是0
    else if(CheckZero(str1)) return str2;               //如果有个一为0
    else if(CheckZero(str2)) return str1;
    string ans;
    int i=str1.size()-1,j=str2.size()-1;
    int flag=0;                                         //进位标记
    while(i>=0||j>=0||flag){
        int numa=i>=0?str1[i--]-'0':0;                  //如果所有位都访问完毕,对应的位置用0代替
        int numb=j>=0?str2[j--]-'0':0;
        flag=numa+numb+flag;                            //计算两位的和
        ans+='0'+flag%10;                               //取个位保存在答案中
        flag/=10;                                       //计算进位
    }
    reverse(ans.begin(),ans.end());
    return ans;
}
string Sub(string str1, string str2){
    //处理0的情况
    if(str1==str2||(CheckZero(str1)&&CheckZero(str2))) return "0";  //如果两数相等或者都是0
    else if(CheckZero(str1)) return "-"+str2;                       //如果第一个数字为0
    else if(CheckZero(str2)) return str1;                           //如果第二个数字为0
    //定正负
    int negative=0;                     //结果的正负号
    if(Lower(str1,str2)){
        swap(str1,str2);                //保证str1大于str2
        negative=1;                     //如果str1小于str2,则结果过为负值
    }
    string ans;
    int i=str1.size()-1,j=str2.size()-1;//逆序开始处理
    int flag=0;                         //借位标记
    while(i>=0||j>=0){
        int numa=i>=0?str1[i--]-'0':0;  //取每一位,因为长度可能不同所以当某一个已经读取完毕时对应位置取0
        int numb=j>=0?str2[j--]-'0':0;
        numa-=flag;                     //先减去借位
        if(numa<numb){                  //如果不够减则向上一位借位(只可能借一位)
            numa+=10;                   //借位并记录借位
            flag=1;
        }
        else flag=0;                    //如果不借位,则借位标记为0
        ans+='0'+numa-numb;             //计算当前位置并保存
    }
    i=ans.size()-1;
    while(ans[i]=='0') i--;
    ans=ans.substr(0,i+1);              //去除前导0,如111-110=1
    if(negative) ans+='-';              //如果计算结果是负数,添加负数符号
    reverse(ans.begin(),ans.end());     //因为是逆序计算得到的结果,所以需要翻转一下
    return ans;
}
string Mul(string str1, string str2){
    if(CheckZero(str1)||CheckZero(str2)) return "0";    //如果有一个为0,则结果为0
 
    int negative=0,negastr1=0,negastr2=0;               //定正负
    if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-字符
        negastr1=1; str1=str1.substr(1,str1.size()-1);
    }
    if(CheckNegative(str2)){
        negastr2=1; str2=str2.substr(1,str2.size()-1);
    }
    negative=negastr1^negastr2;                         //异或运算确定结果的正负号
 
    string ans;
    if(Lower(str1,str2)) swap(str1,str2);               //保证str1大于等于str2
    int size1=str1.size(),size2=str2.size();
    for(int i=size2-1;i>=0;i--){                        //遍历较小数字的每一位
        string temp(size2-1-i,'0');                     //temp为str1乘以str2[i]的积,根据str2[i]的权重(个十百千万,补充对应个数的0)
        int flag=0;                                     //进位标记
        for(int j=size1-1;j>=0;j--){                    //temp
            flag+=(str1[j]-'0')*(str2[i]-'0');
            temp.push_back('0'+(flag%10));
            flag/=10;
        }
        if(flag) temp.push_back('0'+flag);              //如果最高位还有进位
        reverse(temp.begin(),temp.end());
        ans=Add(ans,temp);                              //将计算结果累加到最终的结果上
    }
    if(negative) ans="-"+ans;                           //处理结果的正负号
    return ans;
}
string Div(string str1, string str2){
    //处理除数为0的情况和被除数为0的情况
    if(CheckZero(str2)) return "The divisor cannot be zero!";
    else if(CheckZero(str1)) return "0.000000";
 
    int negative=0,negastr1=0,negastr2=0;               //定正负
    if(CheckNegative(str1)){                            //确定正负号标记,并且去掉-
        negastr1=1; str1=str1.substr(1,str1.size()-1);
    }
    if(CheckNegative(str2)){
        negastr2=1; str2=str2.substr(1,str2.size()-1);
    }
    negative=negastr1^negastr2;                         //异或运算确定结果的正负号
 
    int point=0;                                        //结果是否为纯小数
    if(Lower(str1,str2)) point=1;                       //如果str1小于str2,则计算为纯小数
    string ans;                                         //计算结果
    str1+=string(6,'0');                                //补足6个0,用于计算小数位
 
    int size1=str1.size(),size2=str2.size();
    int i=size2-1;                                      //商第一位的位置
    string temp=str1.substr(0,i);                       //从str1上取size2-1个字符
    for(i;i<size1;i++){
        temp+=str1[i];                                  //从后边拿出一位,预先处理可以防止结尾处越界
        int cnt=0;                                      //当前位的商,也就是temp中包含了多少个str2,使用减法                                          //如果temp不为0,则计算商
        while(Lower(str2,temp)||temp==str2){            //如果当前位商不为0,则计算商
            temp=Sub(temp,str2);
            cnt++;
        }
        if(temp=="0") temp.clear();                     //如果某次计算结果为0,则清空,避免0的堆积,比如111000 111
        ans.push_back('0'+cnt);                         //保存商
    }
    i=0;
    while(ans[i]=='0') i++;
    ans=ans.substr(i,ans.size()-i);                     //去除前导0
    if(point){                                          //如果是纯小数,补足6位并添加小数点
        int len=6-ans.size();
        ans="0."+string(len,'0')+ans;
    }
    else ans.insert((ans.end()-6),'.');                 //如果不是小数,则只需要插入小数点       
    if(negative) ans="-"+ans;                           //最后一步骤,如果是负数带上负号
    return ans;
}
bool Lower(string str1, string str2){                   //长度长的一定大(这里假设除了0以外,都没有前导0),长度相等则字典序小的数字更小
    return str1.size()<str2.size()||(str1.size()==str2.size()&&str1<str2);
}
bool CheckZero(const string &str){      //检查是否等于0
    int size=str.size();                //如果全是0则为0,这里假设不会有带符号的+00000或者-00000作为输入
    for(int i=0;i<size;i++)
        if(str[i]!='0') return false;
    return true;
}
bool CheckNegative(const string &str){  //检查是否为负数
    return str[0]=='-';
}
void ShowMenu(){
    cout<<"请选择要进行的大数运算:\n"
        <<"a) 加法          b) 减法\n"
        <<"c) 乘法          d) 除法\n"
        <<"q) 退出\n"
        <<"请输入你的选择: ";
}
void ShowMenu(char choice){
    cout<<"请输入要计算的两个数字";
    switch(choice){
        case 'a':cout<<"(仅支持非负整数加法计算): "<<endl;break;
        case 'b':cout<<"(仅支持非负整数减法计算): "<<endl;break;
        case 'c':cout<<"(仅支持整数乘法计算): "<<endl;break;
        case 'd':cout<<"(仅支持整数除法计算,计算结果保留6位小数,之后的直接舍弃): "<<endl;break;
    }
}

附录、进一步学习了解

https://blog.csdn.net/weixin_44668898/article/details/96763177

https://blog.csdn.net/wyqxii/article/details/131965735文章来源地址https://www.toymoban.com/news/detail-708897.html

到了这里,关于C++中如何处理超长的数字(long long类型的整数都无法存储的)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

    使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不过这些只是暂时的,后面也

    2024年02月04日
    浏览(40)
  • 在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

    PostgreSQL 提供了对大对象(Large Objects)的支持,这是一种特殊的数据类型,用于存储大量数据,通常用于存储二进制文件或大型文本数据。大对象存储在数据库外部,但在数据库内部进行管理,从而允许您像处理普通数据库对象一样处理它们。 以下是在 PostgreSQL 中处理大对象

    2024年04月27日
    浏览(74)
  • 【解决方法】numpy.float64类型数据无法被解释为整数

    【解决方法】numpy.float64类型数据无法被解释为整数 在使用Python语言进行数据处理时,经常需要用到NumPy库中的各种数据类型和数学函数。其中,Numpy.float64是一种十分常见的数据类型。 然而,有时候我们会遇到这样的错误提示:【numpy.float64 object cannot be interpreted as an integer】

    2024年02月16日
    浏览(42)
  • 【Java】阿拉伯数字转汉字(完全符合中文阅读习惯)(支持所有整数类型)

    网上看过很多实现,但都有 BUG,不是多余0没有处理,就是很多生成的汉字字符串根本不符合中文阅读习惯(各位代码写完测试的时候用例多搞一点啊) 刚好公司有个项目就要实现这个小功能,顾把自己的实现分享出来 看代码前,先观察一下结果是否满足各位的预期 用例输

    2024年02月09日
    浏览(40)
  • 39 C++ 模版中的参数如果 是 vector,list等集合类型如何处理呢?

    在前面写的例子中,模版参数一般都是 int,或者一个类Teacher,假设我们现在有个需求:模版的参数要是vector,list这种结合类型应该怎么写呢? map情况下的处理,好像不管咋写都有build error,这块先剩下,如果有网友知道怎么写,请帮忙在留言中指导一下

    2024年01月25日
    浏览(38)
  • 表达式必须包含整数或枚举类型 - Visual Studio C++ 错误

    在使用 Visual Studio C++ 进行编程时,有时你可能会遇到错误消息:“表达式必须包含整数或枚举类型”。这个错误通常是由于在表达式中使用了错误的数据类型导致的。在本文中,我们将详细解释这个错误的原因,并提供一些可能的解决方案。 错误原因: 当你在 C++ 程序中使

    2024年02月05日
    浏览(50)
  • Visual Studio 2010 C++编译错误“表达式必须包含整数或枚举类型“

    Visual Studio 2010 C++编译错误\\\"表达式必须包含整数或枚举类型\\\" 在使用Visual Studio 2010编写C++代码时,有时候会出现这样的编译错误:“表达式必须包含整数或枚举类型”。这个错误通常是因为我们在写代码时使用了错误的数据类型或者运算符导致的。 下面我们来看一个例子: 在

    2024年02月08日
    浏览(46)
  • java Long 类型如何比较

    Java 中的 Long 类型可以使用下列方法进行比较: 使用 compareTo 方法: 使用三目运算符: 使用 Long.valueOf 和 equals 方法: 请注意,如果要比较两个 Long 对象的值,则应使用 equals 方法,而不是使用 == 运算符。

    2024年02月16日
    浏览(47)
  • MongoDB Long 类型 shell 查询

    1、某数据ID为Long类型,JAVA 定义实体类 @Id Long id 2、查询数据库,此数据存在 3、使用 shell 查询,查不到数据 4、JAVA代码查询Query.query 不受任何影响 long 在 mongo中为 int64 类型,因此直接传递参数,会丢失精度,所以想到加上引号尝试解决 失败原因 加上双引号以后,变成了字

    2024年02月11日
    浏览(37)
  • Java中比较Long类型是否相等

    Java中,比较Long类型是否相等,可以使用“==”和“equals()”方法。 在Java中,\\\"==\\\"用于比较两个基本数据类型或两个引用数据类型是否指向同一对象。对于Long类型的封装类,由于它们的值在-128到127之间时会被缓存,因此这些值相同的Long型对象会指向同一个对象,使用\\\"==\\\"比较会

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包