简体   繁体   English

我正在尝试使用 arrays 添加大量数字,而不使用 bigint 或类似的东西。 C++

[英]I am trying to add large numbers using arrays without using bigint or anything like that. C++

I am trying to add large numbers using arrays without using bigint or anything like that.我正在尝试使用 arrays 添加大量数字,而不使用 bigint 或类似的东西。 I can get my program to add the two arrays.我可以让我的程序添加两个 arrays。 However, I need to take the addition of the arrays and output the correct answer like a regular number.但是,我需要像常规数字一样添加 arrays 和 output 正确答案。 I cannot seem to make an algorithm to take the sum of my arrays and ouptut the answer.我似乎无法制定一个算法来获取我的 arrays 的总和并输出答案。 Does anybody have any tips or suggestions?有没有人有任何提示或建议?

#include <iostream>
#include <string>
#include <iomanip>
#include <algorithm>
#include <iterator>

using namespace std;

const int DIGITS = 20;

void readNum(int list[], int& length, string input1);
void reverseArray(int arr[], int start, int end);
void sumNum(int list1[], int numOfElementsList1,
    int list2[], int numOfElementsList2);


int main()
{
    // Write your main here
    string input1;
    string input2;
    int list[DIGITS];
    int list2[DIGITS];
    int total[DIGITS];
    int input1Length;
    int input2Length;
    cout << "Please enter your 1st number: " << endl;
    cin >> input1;
    cout << "Please enter your 2nd number: " << endl;
    cin >> input2;
    input1Length = input1.length();
    input2Length = input2.length();
    readNum(list, input1Length, input1);
    readNum(list2, input2Length, input2);
    reverseArray(list, 0, input1Length);
    reverseArray(list2, 0, input2Length);
    sumNum(list, input1Length, list2, input2Length);
   

}
void readNum(int list[], int& length, string input1)
{
  
    int array[DIGITS];
    for (int i = 0; i < length; i++)
    {
        array[i] = input1[i] - '0';
        list[i] = array[i];
    }
}
void reverseArray(int arr[], int start, int length)
{
    int end;
    end = length - 1;
    while (start < end)
    {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}
void sumNum(int list1[], int numOfElementsList1,
    int list2[], int numOfElementsList2)
{
    int length;
    int sum = 0;
    int carry = 0;
    int total[DIGITS];
    if (numOfElementsList1 > numOfElementsList2)
    {
        length = numOfElementsList1;
    }
    else
    {
        length = numOfElementsList2;
    }
    for (int i = 0; i < length; i++)
    {
        sum = list1[i] + list2[i] + carry;
        if (sum >= 10)
        {
            sum = sum % 10;
            carry = 1;
        }
        else
        {
            carry = 0;
        }
        total[i] = sum;
        cout << total[i];
    }
        
    

}

Strings are arrays of characters, you could just use them as-is.字符串是 arrays 字符,您可以按原样使用它们。 The advantage being... they're just strings, and you can output them as a string just as easily.优点是......它们只是字符串,您可以像 output 一样轻松地将它们作为字符串。 Not a new technique, it's called a binary coded decimal which in this case is a zoned BCD (where the zone is 0x30 in ASCII, or zone 0xF0 in EBCDIC).这不是一种新技术,它被称为二进制编码的十进制,在这种情况下是分区 BCD(其中区域是 ASCII 中的0x30 ,或 EBCDIC 中的区域0xF0 )。

#include <iostream>
#include <string>
#include <stdexcept>

using std::string;
using std::cout;
using std::cin;
using std::runtime_error;

static string sumNum(string, string);

int main() {
    string input1;
    string input2;
    cout << "Please enter your 1st number: ";
    cin >> input1;
    cout << "Please enter your 2nd number: ";
    cin >> input2;
    auto sum = sumNum(input1, input2);
    cout << "Sum is: " << sum << "\n";
}

string sumNum(string a, string b) {
    //a = string(a.rbegin(), a.rend());
    //b = string(b.rbegin(), b.rend());
    string sum;

    auto digit = [carry = 0](int value) mutable {
        value += carry;
        if (value > 9) {
            carry = 1;
            value -= 10;
        } else {
            carry = 0;
        }

        return static_cast<char>(value + '0');
    };

    auto num = [](char c) {
        if (c < '0' || c > '9') {
            throw runtime_error("not a digit");
        }

        return c - '0';
    };

    auto aa = a.rbegin();
    auto bb = b.rbegin();

    while(aa != a.rend() && bb != b.rend()) {
        sum.push_back(digit((num(*aa)) + (num(*bb))));
        ++aa;
        ++bb;
    }

    while (aa != a.rend()) {
        sum.push_back(digit(num(*aa)));
        ++aa;
    }

    while (bb != b.rend()) {
        sum.push_back(digit(num(*bb)));
        ++bb;
    }

    char last = digit(0);
    if (last != '0')
        sum.push_back(last);

    return string(sum.rbegin(), sum.rend());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM