当前位置:首页 > 编程学习 > C++大整数加减法

C++大整数加减法

编程学习2020-07-1065340

简单实现了加减法,以后有时间了完善乘除法。

/*
*
*   大整数加减法
*
*/

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

#define N 200

//反转字符串
string res(string s)
{
    int i = 0;
    int j = s.length() - 1;

    while (i < j)
    {
        swap(s[i], s[j]);
        i++;
        j--;
    }

    return s;
}

//转换字符串为int数组
int pub(string s1, string s2, int a[], int b[])
{
    s1 = res(s1);
    s2 = res(s2);

    int len1 = s1.length();
    int len2 = s2.length();
    int i, maxlen;
    maxlen = (len1 > len2) ? len1 : len2;

    for (i = 0; i < len1; i++)
    {
        a[i] = s1[i] - '0';
    }

    for (i = 0; i < len2; i++)
    {
        b[i] = s2[i] - '0';
    }

    return maxlen;
}

//加法运算
void add(string s1, string s2)
{
    int a[N] = {0}, b[N] = {0}, c[N] = {0};
    int i, maxlen;
    maxlen = pub(s1, s2, a, b);

    for (i = 0; i < maxlen; i++)
    {
        c[i] = a[i] + b[i];
    }

    for (i = 0; i < maxlen; i++)
    {
        if (c[i] >= 10)
        {
            c[i] = c[i] - 10;
            c[i + 1]++;

            if (maxlen - 1 == i)
            {
                maxlen++;
            }
        }
    }

    for (i = maxlen - 1; i >= 0; i--)
    {
        cout << c[i];
    }

    cout << endl;
}

//减法运算
void sub(string s1, string s2)
{
    int a[N] = {0}, b[N] = {0}, c[N] = {0};
    int i, maxlen, resultlen = -1;
    bool aSmall = false;

    //两数相等直接输出0
    if (s1.compare(s2) == 0)
    {
        cout << 0 << endl;
        return;
    }

    int len1 = s1.length();
    int len2 = s2.length();

    if (len1 == len2)
    {
        aSmall = s1 < s2;
    }
    else
    {
        aSmall = len1 < len2;
    }

    maxlen = pub(s1, s2, a, b);

    if (aSmall)
    {
        cout << '-';

        for (i = 0; i < maxlen; i++)
        {
            c[i] = b[i] - a[i];
        }
    }
    else
    {
        for (i = 0; i < maxlen; i++)
        {
            c[i] = a[i] - b[i];
        }
    }

    for (i = 0; i < maxlen; i++)
    {
        if (c[i] < 0)
        {
            c[i] = c[i] + 10;
            c[i + 1]--;

            if (maxlen - 1 == i)
            {
                maxlen++;
            }
        }
    }
    /////////////////////////
    //去掉结果前的0
    for (i = maxlen; i > 0; i--)
    {
        if (c[i] != 0)
            break;
        else if (c[i] == 0)
        {
            resultlen = i - 1;
        }
    }

    if (resultlen > 0)
    {
        maxlen = resultlen;
    }
    else
    {
        maxlen = 0;
    }

    ////////////////////////

    for (i = maxlen; i >= 0; i--)
    {
        cout << c[i];
    }

    cout << endl;
}

int main()
{
    string s1, s2;
    char ch;
    do
    {
        cout << "输入2个正整数:\n";
        cin >> s1 >> s2;
        if (!isdigit(s1[0]) || !isdigit(s2[0]))
            break;
        cout << "\n输入操作符(+或者-):";
        cin >> ch;

        switch (ch)
        {
        case '+':
            add(s1, s2);
            break;

        case '-':
            sub(s1, s2);
            break;
        }
        cout << endl;
    } while (true);

    system("pause");
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由海阔天空发布,如需转载请注明出处。

本文链接:https://apull.net/html/20200710184538.html

标签: 编程技术C++
分享给朋友:

相关文章

年纪偏大是否适合学习计算机

年纪偏大是否适合学习计算机

★年纪偏大是否适合学习计算机  Q:我本科不是学计算机专业。但是我对计算机的兴趣很大,想明年考北京大学计算机软件的研究生!请问像我这样快30岁的人了,才开始学习计算机是不是太晚了?  A:中国很多人相信程序员是吃青春饭的。 这主要是由中国软件水平发展的现状决定的。 1、大部分都做的是行业管理方面的软件,从计算机技术上说很快就可以进入。 2、很多公司没有管理和技术双重的提升机制,使得人们觉得做管理比做技术有前途,但是仍...

MD5加密VB版

MD5加密VB版

'MD5加密VB版 '调用方法:str=MD5("Apull",32),就能得到"Apull"的32位的MD5。 Private m_lOnBits(30) Private m_l2Power(30) Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private Fu...

制作网页28个常用小代码

制作网页28个常用小代码

1、oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu=return(false)><td>no</table>  可用于Table2、<body onselectstart="return false"> 取消选取、防止复制3、onpaste="retu...

常用asp函数

常用asp函数

<% '------------------------------------- '所有功能函数名如下: ' StrLength(str) 取得字符串长度 ' CutStr(str,strlen) 字符串长度切割 ' CheckIsEmpty(tstr) 检测是否为空 ' isInteger(para) 整数检验 ' CheckName(str) 名字字符校验 ' CheckPassword(str) 密码检验 ' CheckEmail(emai...