字符串中的数字总和(使用字符串对象)C++
Sum of Digits in a String (using string objects) C++
我目前正在尝试获取用户输入的数字字符串,将它们单独转换为整数,并合计它们的总和。
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);
}
- 如何删除作为C++联合的成员变量的字符串对象
- 系统C 从字符串对象sc_uint
- 为什么<string>字符串对象需要 #include 而不是字符串文本?
- 使用C 中字符串标头的getline()函数将第一个char存储在字符串对象中
- C 字符串对象错误字符
- 创建兼容的字符串对象
- 从对象数组打印字符串对象
- 将指针分配给字符串对象的第一个也是最后一个索引
- 比较字符串对象等于向量中的元素
- 传递给 std::runtime_error 的 ctor 的字符串对象的生命周期是多少?
- 如何移动 std::ostringstream 的底层字符串对象?
- 将 const 引用传递给临时字符串对象在 C++ 中安全吗?
- getline 没有为字符串对象分配任何值
- 在c++中删除字符串对象
- 如何在没有收到需要分号编译错误的情况下从 c++ 中的函数返回字符串对象
- 你能在C++中返回字符串对象的局部变量吗?
- 将字符串对象的地址传递给函数
- C++:从字符串对象中提取整数
- 是否有理由使用字符串 => 索引到向量的映射,而不是字符串 => 对象?
- 控制对多线程程序中字符串对象的访问的最佳方法