字符串中的数字总和(使用字符串对象)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 <= num && num <= 9);
可以提供更好的性能和更简洁的代码。【参考方案2】:
而不是 istringstream(digits.at(i)) >> num ,尝试使用这种转换方式:
num = ((int)digits.at(i))-((int) ('0'));
您将拥有一个更快的代码。
【讨论】:
这远远超出了必要的转换,特别是考虑到您可以使用char
进行数学运算。在0
比任何其他数字都大的非常意外的情况下,无论如何都会有更多的事情发生。
使用多种语言/编译器的坏习惯。有时需要从 char 显式转换为 int 以避免警告/错误。
啊,我明白了,通常只有在您为更窄的类型分配可能更大的值时才会发生(例如,从int
到char
)。【参考方案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++的主要内容,如果未能解决你的问题,请参考以下文章