美文网首页C/C++学习笔记
使用字符串完成大数的加减运算

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

作者: 零岁的我 | 来源:发表于2020-02-23 20:07 被阅读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;
}

相关文章

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

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

  • mysql之字符串进行运算或大小比较

    mysql字符串进行加减乘除的运算: 在mysql当中,字符串类型间进行加减乘除运算的时候,会截取字符串以数字开头...

  • 字符串可增量

    字符串可以进行加减运算 Example: 可运用到excel中

  • 机试常用算法和题型-大数专题

    大数专题 字符加减关系,实现任意长度整数相加 大数加法,进阶转换版 大数浮点数加法 大数运算之阶乘

  • 运算

    程序最主要的工作就是完成运算,下面主要学习c语言基本运算符号及使用,先从最基本的加减乘除开始。 1、基本运算 首先...

  • 06 运算符、管理一组开关状态

    一.算数运算符 1. 加减乘除余 2.自增自减 ++ 、-- 常规对数字使用 对字符串使用,只能自增,自增效果规则...

  • 大数运算加减乘除

    大数是啥?来一段百度百科的话由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算...

  • 不用加减乘除运算符,求整数的7倍

    问题 不用加减乘除运算符,求整数的7倍 思路 当需要进行避免使用加减乘除的数学运算的时候,通常的方法有:位运算、E...

  • shell循环

    字符串长度 字符串分割 只读readonly 清除变量的值 键盘获得变量值 加减乘除运算 text 测试语句 逻辑...

  • 2020-06-12 day 2

    数据类型转换 自动类型转换 强制类型转换 运算符 加减乘除字符串加是追加的方式比较运算符== < > >= <= ...

网友评论

    本文标题:使用字符串完成大数的加减运算

    本文链接:https://www.haomeiwen.com/subject/esvsqhtx.html