C/C++学习笔记

使用字符串完成大数的加减运算

2020-02-23  本文已影响0人  零岁的我

这里的大数指的是远超long long int的数。

#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
#define base 10

//去掉正数前面的0
string deZero(string s)
{
    long int i;
    for(i=0;i<s.length();++i){
        if(s.at(i)>48){
            break;
        }
    }
    if(i==s.length())
        return "0";
    s.erase(0,i);
    return s;
}

//使用string完成大数加法
string bigNumAdd(string str1,string str2)
{
    int tmp;
    string strSum;
    str1=deZero(str1);
    str2=deZero(str2);
    long int len1=str1.size();//size()函数返回的是字符串去掉结尾标志"\0"后的长度
    long int len2=str2.size();
    int bit=0;
    while(len1 && len2){
        tmp=str1[len1-1]-'0'+str2[len2-1]-'0'+bit; //str1[len1-1]-'0'由字符数字转数字
        bit=tmp/10;
        tmp%=10;
        strSum+=tmp+'0';
        --len1;
        --len2;
    }
    while(len1){
        tmp=str1[len1-1]-'0'+bit;
        bit=tmp/base;
        tmp%=base;
        strSum+=tmp+'0';
        --len1;
    }
    while(len2){
        tmp=str2[len2-1]-'0'+bit;
        bit=tmp/10;
        tmp%=10;
        strSum+=tmp+'0';
        --len2;
    }
    if(bit){
        strSum+=bit+'0';
    }
    reverse(strSum.begin(),strSum.end());
    return strSum;
}

//判断两个正数的大小
int judge(string str1,string str2)
{
    if(str1.length()>str2.length())
        return 1;
    if(str1.length()<str2.length())
        return -1;
    long int i;
    for(i=0;i<str1.length();++i){
        if(str1.at(i)>str2.at(i))
            return 1;
        if(str1.at(i)<str2.at(i)){
            return -1;
        }
    }
    return 0;
}

//使用string完成大数减法
string substract(string str1,string str2)
{
    str1=deZero(str1);
    str2=deZero(str2);
    int i=judge(str1,str2);
    string d="-";
    int j=0;
    if(i==0)
        return "0";
    if(i==-1){
        string tmp=str1;
        str1=str2;
        str2=tmp;
        j=-1;
    }
    long int len1=str1.length();
    long int len2=str2.length();
    int temp;
    int bit=0;
    string strResult;
    cout<<str1<<str2<<endl;
    while(len1 && len2){
        str1[len1-1]-=bit;
        if(str1.at(len1-1)<str2.at(len2-1)){
            bit=1;
        }
        else{
            bit=0;
        }
        temp=bit*base+(str1[len1-1]-'0')-(str2[len2-1]-'0');
        strResult+=temp+'0';
        --len1;
        --len2;
    }
    while(len1){
        str1[len1-1]-=bit;
        if(str1.at(len1-1)<48){
            bit=1;
        }
        else{
            bit=0;
        }
        temp=bit*base+str1[len1-1]-'0';
        strResult+=temp+'0';
        --len1;
    }
    reverse(strResult.begin(),strResult.end());
    strResult=deZero(strResult);
    if(j==-1)
        strResult.insert(0,d);
    return strResult;
}

int main(int argc,char **argv)
{
    string str1="13217457591712738252762127461276498466551651";
    string str2="464646132157216765212427137317175217517415";
    string str=bigNumAdd(str1,str2);
    cout<<str1<<"+"<<str2<<"="<<str<<endl;

    string str3="0123";
    string str4="4560";
    string str5=substract(str3,str4);
    cout<<str3<<"-"<<str4<<"="<<str5<<endl;
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读