实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

//实现大整数相加
//还得考虑符号位,一个比另一个短
#include<iostream>
#include <string>
#include <cstring>

using namespace std;
#define maxlen 2001
int a[maxlen];
int b[maxlen];
int len1, len2, i, j;

int bigger(int a, int b)
{
    return a>b ? a : b;
}

void Add(int underzero)
{
    if (underzero)
        cout << ‘-‘;
    int big = bigger(len1, len2);
    for (i = 0; i <= big; i++)
    {
        a[i] += b[i];
        if (a[i] >= 10)
        {
            a[i] -= 10;
            a[i + 1]++;
        }
    }

    bool flag = false;//用来忽略高位的0,中间的0才是有效数字
    for (i = big; i >= 0; i--)
    {
        if (flag)
            cout << a[i];
        else if (a[i])
        {
            cout << a[i];
            flag = true;
        }
    }
    cout << endl;
}

void Minus(int aa[], int bb[], int biglen, int underzero)
{
    if (underzero)
        cout << ‘-‘;
    for (i = 0; i <= biglen; i++)
    {
        if (aa[i] >= bb[i])
            aa[i] -= bb[i];
        else
        {
            aa[i] = aa[i] + 10 - bb[i];
            aa[i + 1]--;
        }
    }

    bool flag = false;//同样去掉最高位的无效‘1’
    for (i = biglen; i >= 0; i--)
    {
        if (flag)
            cout << aa[i];
        else if (aa[i])
        {
            cout << aa[i];
            flag = true;
        }
    }
    cout << endl;
}

int main()
{
    string s1, s2;
    bool success;
    while (cin >> s1 >> s2)
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        len1 = s1.length();
        len2 = s2.length();

        for (i = len1 - 1, j = 0; i>0; i--)
            a[j++] = s1[i] - ‘0‘;
        if (s1[0] != ‘-‘)
            a[j] = s1[0] - ‘0‘;
        for (i = len2 - 1, j = 0; i>0; i--)
            b[j++] = s2[i] - ‘0‘;
        if (s2[0] != ‘-‘)
            b[j] = s2[0] - ‘0‘;

        if (s1[0] == ‘-‘ && s2[0] == ‘-‘)
            Add(1);  //和为负
        else if (s1[0] != ‘-‘ && s2[0] != ‘-‘)
            Add(0);  //和为正
        else if (s1[0] == ‘-‘)
        {
            if (len1 - 1 > len2) //负数大
                Minus(a, b, len1 - 1, 1);
            else if (len1 - 1 < len2) //正数大
                Minus(b, a, len2, 0);
            else
            {
                success = true;
                for (i = len1 - 2, j = len2 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                {
                    if (a[i]>b[j]) //负数大
                    {
                        success = false;
                        Minus(a, b, len2, 1);
                        break;
                    }
                    else if (a[i]<b[j]) //正数大
                    {
                        success = false;
                        Minus(b, a, len2, 0);
                        break;
                    }
                }
                if (success) //相等
                    cout << "0" << endl;
            }
        }
        else if (s2[0] == ‘-‘)
        {
            if (len2 - 1 > len1) //负数大
                Minus(b, a, len2 - 1, 1);
            else if (len2 - 1 < len1) //正数大
                Minus(a, b, len1, 0);
            else
            {
                success = true;
                for (i = len2 - 2, j = len1 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                {
                    if (a[j]>b[i]) //正数大
                    {
                        success = false;
                        Minus(a, b, len1, 0);
                        break;
                    }
                    else if (a[j]<b[i]) //负数大
                    {
                        success = false;
                        Minus(b, a, len1, 1);
                        break;
                    }
                }
                if (success) //相等
                    cout << "0" << endl;
            }
        }
    }
    return 0;
}

//实现大整数相加
//还得考虑符号位,一个比另一个短
#include<iostream>
#include <string>
#include <cstring>

using namespace std;
#define maxlen 2001
int a[maxlen];
int b[maxlen];
int len1, len2, i, j;

int bigger(int a, int b)
{
    return a>b ? a : b;
}

void Add(int underzero)
{
    if (underzero)
        cout << ‘-‘;
    int big = bigger(len1, len2);
    for (i = 0; i <= big; i++)
    {
        a[i] += b[i];
        if (a[i] >= 10)
        {
            a[i] -= 10;
            a[i + 1]++;
        }
    }

    bool flag = false;//用来忽略高位的0,中间的0才是有效数字
    for (i = big; i >= 0; i--)
    {
        if (flag)
            cout << a[i];
        else if (a[i])
        {
            cout << a[i];
            flag = true;
        }
    }
    cout << endl;
}

void Minus(int aa[], int bb[], int biglen, int underzero)//数组的元素下标从小到大对应大整数(低位->高位)哪一个数的绝对值大,那个数就放前面,underzero=1表示最终结果为负数
{
    if (underzero)
        cout << ‘-‘;
    for (i = 0; i <= biglen; i++)
    {
        if (aa[i] >= bb[i])
            aa[i] -= bb[i];
        else
        {
            aa[i] = aa[i] + 10 - bb[i];
            aa[i + 1]--;
        }
    }

    bool flag = false;//同样去掉最高位的无效‘1’
    for (i = biglen; i >= 0; i--)
    {
        if (flag)
            cout << aa[i];
        else if (aa[i])
        {
            cout << aa[i];
            flag = true;
        }
    }
    cout << endl;
}

int main()
{
    string s1, s2;
    bool success;
    while (cin >> s1 >> s2)
    {
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        len1 = s1.length();
        len2 = s2.length();

        for (i = len1 - 1, j = 0; i>0; i--)//将大整数的最低位(个位)存入到数组下标最小的位置
            a[j++] = s1[i] - ‘0‘;
        if (s1[0] != ‘-‘)
            a[j] = s1[0] - ‘0‘;
        for (i = len2 - 1, j = 0; i>0; i--)
            b[j++] = s2[i] - ‘0‘;
        if (s2[0] != ‘-‘)
            b[j] = s2[0] - ‘0‘;

        if (s1[0] == ‘-‘ && s2[0] == ‘-‘)
            Add(1);  //和为负
        else if (s1[0] != ‘-‘ && s2[0] != ‘-‘)
            Add(0);  //和为正
        else if (s1[0] == ‘-‘)
        {
            if (len1 - 1 > len2) //负数大
                Minus(a, b, len1 - 1, 1);
            else if (len1 - 1 < len2) //正数大
                Minus(b, a, len2, 0);
            else
            {
                success = true;
                for (i = len1 - 2, j = len2 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                {
                    if (a[i]>b[j]) //负数大
                    {
                        success = false;
                        Minus(a, b, len2, 1);
                        break;
                    }
                    else if (a[i]<b[j]) //正数大
                    {
                        success = false;
                        Minus(b, a, len2, 0);
                        break;
                    }
                }
                if (success) //相等
                    cout << "0" << endl;
            }
        }
        else if (s2[0] == ‘-‘)
        {
            if (len2 - 1 > len1) //负数大
                Minus(b, a, len2 - 1, 1);
            else if (len2 - 1 < len1) //正数大
                Minus(a, b, len1, 0);
            else
            {
                success = true;
                for (i = len2 - 2, j = len1 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                {
                    if (a[j]>b[i]) //正数大
                    {
                        success = false;
                        Minus(a, b, len1, 0);
                        break;
                    }
                    else if (a[j]<b[i]) //负数大
                    {
                        success = false;
                        Minus(b, a, len1, 1);
                        break;
                    }
                }
                if (success) //相等
                    cout << "0" << endl;
            }
        }
    }
    return 0;
}

时间: 2024-10-24 18:27:45

实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!的相关文章

算法---大整数相加

原文:算法---大整数相加 开通博客开始第一次写发表算法博客.深知一半算法考试都是用C,C++,由于大四开始到今年毕业工作到现在一直从事C#开发,C++用得很少了.链表,指针也只知道一个概念了.用得没以前熟练了.所以后续更新的算法题我都是基于C#语法的.算法主要体现的是解题思路.跟题目一样,本次算法主要实现大数据相加. 解题思路: 1. 将大数据存储到一个链表中,C#中用List<int>来存储,每个节点表示每一位的数字. {1,2,3,4,5} =>12345 和{9,6,5,9,5}

HDU 1002 A + B Problem II(大整数相加)

A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input c

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

如何实现大整数相加

思路:在程序中列出 "竖式" ,然后逐位相加.究竟是什么样子呢?我们以 426709752318 + 95481253129 为例,来看看大整数相加的详细步骤: 第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置.之所以倒序存储,更加符合我们从左到右访问数组的习惯. 第二步,创建结果数组,结果数组的最大长度是较大整数的位数+1,原因很明显. 第三步,遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样. 例子中,最先相加的是数组A的

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

ACM: A + B Problem II (两个大整数相加)

Code: #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX 1000 //给数组赋值 void arrV(int a[],int len,int p){ int i; for(i=0;i<len;i++){ a[i]=p; } } //打印数组中的运算结果 void printRverse(int a[]){ int len=0,i=0; while(a[i]!=-1){

C++ string 实现大整数相加减

任意两个大整数的加减算法,可自动判断正负号,代码如下: #include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <string> using namespace std; string BigInegerAdd(string s1, string s2) // s1+s2; { int len = s1.size()>s2.

大整数相加问题

#include <iostream> #include <string> /*project:两个大整数相加 **@author:浅滩 **data:2019.05.15 */ using namespace std; void add(const string &,const string &); int main() {int n; string str1,str2; cin>>str1>>str2; add(str1,str2); }

HDOJ-1002 A + B Problem II (非负大整数相加)

http://acm.hdu.edu.cn/showproblem.php?pid=1002 输入的数都是正整数,比较好处理,注意进位. //非负大整数加法 # include <stdio.h> # include <string.h> # define MAX 1100 int main() { int t; char Num1[MAX], Num2[MAX], Num3[MAX];//Num3[] 用于保存结果 scanf("%d", &t); f