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

C++大整数加减法

编程学习2020-07-1049700

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

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

#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++
分享给朋友:

相关文章

VB获取光驱盘符

VB获取光驱盘符

VB获取光驱盘符Option Explicit Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" _ (ByVal nDrive As String) As Long 'GetLogicalDriveStrings-->获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径 Private Declare Function GetLogicalDriveStri...

VB.NET中如何扩充字符串进行固定宽度显示

VB.NET中如何扩充字符串进行固定宽度显示

  在VB.NET中,当你需要在控制台显示数据或准备好打印数据时,可能需要调整列宽以显示固定长度的数据。本文介绍了使用String对象的PadLeft方法和PadRight方法扩充字符串以进行固定宽度显示。PadLeft和PadRight方法      PadLeft和PadRight是字符串类的两个方法,可以分别使用它们在字符串的左边和右边填充空格。这两个方法多接受一个代表总长度的整型数,添加的空格数等于填充总长度减去字符串的当前长...

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

VB.NET 用ShellExecuteEx 打开系统文件属性对话框 模块

' ' VB.NET 调用系统文件属性对话框模块 ' ' by: Apull ' QQ:374237545 ' http://www.apull.net ' 2007-6-9 ' ' Imports System.Runtime.InteropServices     Mod...

VB/VB.net 只允许运行一个实例

VB/VB.net 只允许运行一个实例

VB/VB.net  只允许运行一个实例       by:  Apull  VB中的实现方法VB如何防止程序被重复加载,也就是只允许运行一个实例,一般有2种方法。一,直接用VB提供的APP对象的PrevInstance方法。PrevInstance的返回值为True则说明已经有一个实力在运行。If App.PrevInstance Then Msgbox "已经有一个实例在运行" End if这个...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。