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

C++大整数加减法

编程学习2020-07-1058950

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

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

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

相关文章

关于学习编程和C语言

关于学习编程和C语言

关于学习编程和C语言  转自 开复网 Q:该怎么学习编程?  A:首先问你一个问题:你们在学校都学些什么课程? 问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比如,尽管你将来不会去涉及电脑的...

密码的故事

密码的故事

密码的故事Billy Hollis 本文是由一个问题引出的。我需要一种将密码保存在加密文件中的方法,因为我需要记住许多密码,但记忆力却已大不如前。我知道有许多商用工具能够做到这一点,但我感到学习  .NET 中的一项新技术真的很有好处。 我用 Visual Basic® .NET  完成了一个简单而完整的程序,用于加密和解密文件,从中学到了许多知识。既然加密对于多种开发都是一个重要问题,本文就介绍一下如何构造这样的程序。 有各种低级别的技术可以用于加密,...

代码迷惑技术如何保护Java免遭逆向工程

代码迷惑技术如何保护Java免遭逆向工程

很少有问题比程序员遇到不访问无法利用的源代码就无法解决的漏洞更令人沮丧的了。你是否在通过一个在线开源库修补代码,或正在调用常用操作系统例行程序;你可能每周都要花时间处理不是由你编写,因而也无法访问其源代码的代码。因为Java字节码包含许多和原始代码相同的信息,所以很容易对Java类文件执行逆向工程。另外,Java程度以其“一旦编写,随处运行”特性而闻名。虽然并非Java语言的专利,但代码反编译从未在Java开发者之中得到如此公开或普遍地利用。反编译的对...

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这个...

发表评论

访客

看不清,换一张

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