字符串中的数字总和(使用字符串对象)C++

Sum of Digits in a String (using string objects) C++

本文关键字:字符串 对象 C++ 数字      更新时间:2023-10-16

我目前正在尝试获取用户输入的数字字符串,将它们单独转换为整数,并合计它们的总和。

EX:如果用户输入"1234",程序应执行 1 + 2 + 3 + 4 并显示"10"。我尝试了很多实验,但似乎停滞不前。

我希望使用 C 字符串/字符串对象创建此代码,如果可能的话,请使用"istringstream()"(虽然不是必需的......[特别是如果有更简单的方法...])

这是我到目前为止所拥有的:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    string digits;
    int total = 0, num;
    cout << "Enter a string of digits, and something magical will happen to them..." << endl;
    cin >> digits;
    for (int i = 0; i < digits.length(); i++)
    {   
        cout << digits.at(i) << endl;
        istringstream(digits.at(i)) >> num;
        cout << num << endl;    // Displays what came out of function
        total += num;
    }
    cout << "Total: " << total << endl;
    // Digitize me cap'm
    // Add string of digits together
    // Display Sum
    // Display high/low int in string
}

我做错了什么?为什么我在 for 循环中不断获得超高的数字?我应该使用更有效的功能吗?感谢您的任何帮助:)

应该是

for (int i = 0; i < digits.length(); i++)
{   
    cout << digits.at(i) << endl;
    num = digits.at(i) - '0';
    assert(0 <= num && num <= 9);
    cout << num << endl;    // Displays what came out of function
    total += num;
}

要转换单个数字,您不需要像字符串流这样的复杂东西。您也可以使用(不推荐)istringstream(digits.substr(i, 1))

而不是

istringstream(digits.at(i))>> num ,尝试使用这种转换方式:

num = ((int)digits.at(i))-((int) ('0'));

您将拥有一个更快的代码。

我会创建一个新函数来获取任何数字的数字和:

long long digitSum(long long number)
{
    long long sum = 0;
    while (number != 0)
    {
        sum += number % 10;
        number /= 10;
    }
    return sum;
}

然后你可以在你的main()中做:

int main()
{
    string digits;
    cout << "Enter a string of digits, and something magical will happen to them..." << endl;
    cin >> digits;
    auto enteredNumber = std::stoll(digits);
    auto total = digitSum(enteredNumber);
    cout << "Total: " << total << endl;
}

函数 std::stoll 将std::string转换为long long

但是,这将限制用户可以输入的数字。因此,另一种方法是,就像已经说过的其他答案一样,使用chars的属性(它们只是一个数字)。

字符'0'的值为 48 。字符'1'的值为 49 。所以当你做'1' - '0'你会得到结果1,这正是char表示中数字的数字值。

这意味着您可以执行以下操作:

long long digitSum(string numberStr)
{
    long long sum = 0;
    for (int i = 0; i < numberStr.length(); i++)
    { 
        auto charValue = numberStr.at(i) - '0';
        sum += charValue;
    }
    return sum;
}

这将使您的主要看起来像这样:

int main()
{
    string digits;
    cout << "Enter a string of digits, and something magical will happen to them..." << endl;
    cin >> digits;
    auto total = digitSum(digits);
    cout << "Total: " << total << endl;
}

假设您对 ASCII 有一点了解(如果您不知道,我将在评论部分解释):

long long sumOfDigitsInString(string n)
{
    long long sum = 0; 
    for(char& c : n) // for each char in string n
    {
         int b = int(c)-48; // this is involved in ascii
         sum += b;
    }
    return sum;
}
int main() {
    string n;
    cin >> n;
    cout << sumOfDigitsInString(n);
}

我用两件事扩展了以前的答案。我建议在常规石膏之前使用static_cast (int) .忽略字符串中的非数字字符以防止崩溃或错误行为也是很好的。最终的解决方案如下所示:

#include <iostream>
#include <string>
using namespace std;
long long sumOfDigitsInString(string digits)
{
    long long sum = 0; 
    for(auto& ch : digits)
    {
         if (isdigit(ch))
         {
            sum += static_cast<int>(ch) - 48;
         }
    }
    return sum;
}
int main() {
    string n;
    cin >> n;
    cout << sumOfDigitsInString(n);
}