用于避免数量限制的添加字符串

Addition string to avoid number limitation

本文关键字:添加 字符串 用于      更新时间:2023-10-16

我想像小时候一样,通过逐个数字相加来添加两个数字。

为了计算非常长的数字(超过C++限制)。

我的第一步是尝试一个总和<10 的示例 2 个数字:

string valeur1 = "135";
string valeur2 = "844";
string result;
for (int i = 0; i < valeur1.length(); i++)
{
        std::ostringstream ss;
        int value;
        int value3;
        int value2;
        //string to int
        valeur1[i] >> value;
        valeur2[i] >> value2;
        value3 = (value + value2);
        // int to string
        ss << value3;
        result = result + ss.str();
}
cout << result;

我正朝着正确的方向前进吗?

我认为你正朝着正确的方向前进。您可以改进的三件事:

  1. 您必须考虑值 3 何时大于 10(您似乎意识到这一点)
  2. 当两个数字的位数不同时要小心。现在,在这种情况下,您的代码将失败。
  3. 您正在使用字符数组。为什么不使用整数数组呢?如果您只想避免整数的大小限制,我认为这将是一个更好的选择,因为您不需要所有字符串<>整数转换。

你的第一步非常简单:

#include <string>
#include <iostream>
int main()
    {
std::string s1 = "135";
std::string s2 = "844";
std::string result;
for(size_t i=0;i<std::min(s1.size(),s2.size());i++)
    result+= std::to_string(s1[i]-'0'+s2[i]-'0');
std::cout<<result<<std::endl;
return 0;
    }

编辑:

正如杰拉德·阿贝洛(Gerard Abello)所指出的,当总和大于3时,您应该考虑字符串的不同大小和大小写。但是,我相信字符串表示是一个不错的选择。将数字添加为字符串的选项之一。

# include <string>
# include <iostream>
std::pair<int,std::string> simpleConvert(const std::string &str);
std::string add(const std::string &first,const std::string &second);
int main()
    {
    std::string s1 = "128";
    std::string s2 = "9999";
    std::string result = add(s1,s2);
    std::cout<<result<<std::endl;
    return 0;
    }
std::pair<int,std::string> simpleConvert(const std::string &str)
    {
    if(str.size()==1)
        return std::make_pair(0,str);
    else if(str.size()==2)
        return std::make_pair(str[0]-'0',std::string(str.begin()+1,str.end()));
    }
std::string add(const std::string &first,const std::string &second)
    {
    std::string s1(first.rbegin(),first.rend()); 
    std::string s2(second.rbegin(),second.rend());
    auto n = s1.size();
    auto m = s2.size();
    auto min = std::min(n,m);
    auto max = std::max(n,m);
    for(size_t j=min;j!=max;j++)
        if(n<m)
            s1+="0";
        else 
            s2+="0";
    std::string result;
    int add=0;
    for(size_t i=0;i<s1.size();i++)
        {
        auto temp = simpleConvert(std::to_string(s1[i]-'0'+s2[i]-'0'+add));
        result+= temp.second;
        add = temp.first;
        }
    if(add!=0)
        result+=std::to_string(add);
    return std::string(result.rbegin(),result.rend());
    }