【问题标题】:Sum of Digits in a String (using string objects) C++字符串中的数字总和(使用字符串对象)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)) 甚至不应该编译,您使用的是什么编译器/标准库?

标签: c++ string object sum c-strings


【解决方案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::stollstd::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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多