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

Posted

技术标签:

【中文标题】字符串中的数字总和(使用字符串对象)C++【英文标题】:Sum of Digits in a String (using string objects) C++ 【发布时间】:2014-12-11 09:50:40 【问题描述】:

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

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

我希望使用 C-string/String 对象创建此代码,并尽可能使用“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 循环中不断获得超高数字?我应该使用更有效的功能吗?谢谢你的帮助:)

【问题讨论】:

istringstream(digits.at(i)) 甚至不应该编译,您使用的是什么编译器/标准库? 【参考方案1】:

应该是

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;

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

【讨论】:

感谢大家的快速响应(天哪,你们都快速响应)!我选择了这个——我认为这是我的教授最想要的。谢谢 Mohit... Noob 问题:assert() 0-9 是因为它是我们正在阅读的单个数字吗?另外,放一个-'0'有什么意义? 我很高兴它对你有用。断言只会确保所有数字都在0-9 范围内(并且该输入不包含a、b 等字符)。 '0' 是字符0 的代码,它可能不为零。在大多数编码(例如 ANSI)上,1、2、3 等的代码是连续的。所以从一个字符中减去'0' 会将该字符转换为所需的数字。 isdigit(num) 替换assert(0 &lt;= num &amp;&amp; num &lt;= 9); 可以提供更好的性能和更简洁的代码。【参考方案2】:

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

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

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

【讨论】:

这远远超出了必要的转换,特别是考虑到您可以使用 char 进行数学运算。在0 比任何其他数字都大的非常意外的情况下,无论如何都会有更多的事情发生。 使用多种语言/编译器的坏习惯。有时需要从 char 显式转换为 int 以避免警告/错误。 啊,我明白了,通常只有在您为更窄的类型分配可能更大的值时才会发生(例如,从intchar)。【参考方案3】:

我将创建一个新函数来获取任意数字的数字总和:

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;

【讨论】:

【参考方案4】:

假设你对 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);

【讨论】:

【参考方案5】:

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

#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);

【讨论】:

以上是关于字符串中的数字总和(使用字符串对象)C++的主要内容,如果未能解决你的问题,请参考以下文章

给定二进制字符串中不同数字的数量及其总和

c++字符串转化为数字

有没有办法从字符串中获取数字并使用 XSLT 计算相同的总和?

如何检查字符串中的数据是不是是 C++ 上的数字?

从字符串中的多个数字中删除前导零? [C++]

介绍性 C++:将字符串与文件行中的数字分开并将这些数字相加