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

C++大整数加减法

编程学习2020-07-1063500

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

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

#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://www.apull.net/html/20200710184538.html

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

相关文章

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

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

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

VB连接SQLServer数据库操作代码

VB连接SQLServer数据库操作代码

第一步,在ModConString模块中定义一系列变量'定义一个属性过程反映连接字符串Public Property Get conString() As Variant conString = "data source=.;initial catalog=Sims_four;user End Property'定义一个提供者反映数据库类型Public Property Get conProvide() As Variant co...

ASP六大对象介绍

ASP六大对象介绍

Application对象 Application对象是个应用程序级的对象,用来在所有用户间共享信息,并可以在Web应用程序运行期间持久地保持数据。 Application的属性:  方法如下: Application对象没有内置的属性,但是我们可以自行创建其属性。 <% Application("属性名")=值 %>    其实大部分Application变量都 存放在Contents集合中,当你创建一个新的Application变量时,其实...

VB.NET关于加密算法

VB.NET关于加密算法

加密将防止数据被查看或修改,并在原本不安全的信道上提供安全的通信信道,它达到以下目的:  保密性:防止用户的标识或数据被读取。  数据完整性:防止数据被更改。  身份验证:确保数据发自特定的一方。  基本概念  1、散列(HASH)函数  散列(HASH)函数H也称哈希函数或杂凑函数等,是典型的多到一的函数,其输入为一可变长x(可以足够的长),输出一固定长的串h(一般为128位、160位,比输入的串短),该串h被称为输入x的Hash值(或称消息摘要Message  ...