我正在尝试自己学习c ++,而且我遇到了一些障碍。问题是我需要取一个整数,将其分成数字并得到数字的总和并显示它们。
示例:
输入号码:123456
整数中的数字:1 2 3 4 5 6
总和:21
我已经完成了所有工作,但是当我将整数转换为数字时,我无法正确显示它。它以相反的顺序显示。
因此,在下面的程序中,我输入1234
并吐出4 3 2 1
。我知道为什么,我只是不知道如何解决它。
到目前为止,这是我的代码:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <math.h>
int countDigitsInInteger(int n)
{
int count =0;
while(n>0)
{
count++;
n=n/10;
}
return count;
}
using namespace std;
int main(int argc, char *argv[])
{
int intLength =0;
int number;
int digit;
int sum = 0;
string s;
cout << "Please enter an integer ";
cin >>number;
cout << "Orginal Number = "<<number <<endl;
//make the number positive
if (number<0)
number = -number;
intLength = countDigitsInInteger(number);
//break apart the integer into digits
while(number>0)
{
digit = number % 10;
number = number / 10;
cout <<digit << " ";
sum = sum+digit;
}
cout <<endl <<"Sum of the digits is: "<<sum<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
这是我的解决方案
看不到:)。
答案 0 :(得分:8)
你的问题来自你正在向后读数字的事实,因此你需要向后打印它们。 stack会对你有很大的帮助。
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <stack>
int countDigitsInInteger(int n)
{
int count =0;
while(n>0)
{
count++;
n=n/10;
}
return count;
}
using namespace std;
int main(int argc, char *argv[])
{
int intLength =0;
int number;
int digit;
int sum = 0;
string s;
cout << "Please enter an integer ";
cin >>number;
cout << "Orginal Number = "<<number <<endl;
//make the number positive
if (number<0)
number = -number;
intLength = countDigitsInInteger(number);
//break apart the integer into digits
stack<int> digitstack;
while(number>0)
{
digit = number % 10;
number = number / 10;
digitstack.push(digit);
sum = sum+digit;
}
while(digitstack.size() > 0)
{
cout << digitstack.top() << " ";
digitstack.pop();
}
cout <<endl <<"Sum of the digits is: "<<sum<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
哦,顺便说一句,保持你的缩进清洁。它很重要。
编辑:回应史蒂夫汤森,这种方法不一定是矫枉过正,它与你的不同。代码可以缩小,以便看起来不像过度杀伤:#include <iostream>
#include <stack>
#include <string>
using namespace std;
int getInput(string prompt)
{
int val;
cout << prompt;
cin >> val;
return val < 0 ? -val : val;
}
int main(int argc, char** argv)
{
int num = getInput("Enter a number: ");
cout << "Original Number: " << num << endl;
stack<int> digits;
int sum = 0;
while(num > 0)
{
digits.push(num % 10);
sum += digits.top();
num = num / 10;
}
while(digits.size() > 0)
{
cout << digits.top() << " ";
digits.pop();
}
cout << endl << "Sum of digits is " << sum << endl;
return 0;
}
答案 1 :(得分:4)
堆栈和递归对于这个问题来说太过分了。只需将每个数字存储到string中,然后再输出reverse。您需要了解如何与reverse
成员联系string
以实现此目的。 for_each可用于输出字符串的每个元素。
要获得额外的功劳(凭借简洁和富有表现力),请将该号码直接插入ostringstream并将其用作可逆string
的基础。
此代码的stringstream
版本长度为5行。逻辑是:
for_each
逐位输出结果。您可以使用字符串上的accumulate对数字求和,为您提供int('1') != 1
这一事实的说明。这是额外的两行,用于对数字求和并输出结果。
关键不在于通过堆栈或递归来做这件事是不好的,只是一旦你对STL更熟悉,通常有更优雅的方式来完成工作而不是显而易见的。使用堆栈,递归和您可以想到的任何其他方式实现这一点,可以将简单的功课转化为真实的学习体验。
以下是accumulate
代码,用于汇总由小数位组成的string
成员,例如:
#include <string>
#include <numeric>
std::string intString("654321");
int sum = accumulate(intString.begin(), intString.end(), 0) -
(intString.size() * int('0'));
编辑:这是完整的代码,用于比较目的:
ostringstream intStream;
int value(123456);
intStream << value;
string intString(intStream.str());
for_each(intString.begin(), intString.end(), [] (char c) { cout << c << endl; });
int sum = accumulate(intString.begin(), intString.end(), 0) -
(intString.size() * int('0'));
cout << "Sum is " << sum << endl;
答案 2 :(得分:3)
我们不要忘记 stringstream 方法,我也觉得很优雅。
#include <iostream>
#include <sstream>
int main()
{
int num = 123456789;
std::cout << "Number: " << num << std::endl;
std::stringstream tmp_stream;
tmp_stream << num;
std::cout << "As string: " << tmp_stream.str() << std::endl;
std::cout << "Total digits: " << tmp_stream.str().size() << std::endl;
int i;
for (i = 0; i < tmp_stream.str().size(); i++)
{
std::cout << "Digit [" << i << "] is: " << tmp_stream.str().at(i) << std::endl;
}
return 0;
}
输出:
Number: 123456789
As string: 123456789
Total digits: 9
Digit [0] is: 1
Digit [1] is: 2
Digit [2] is: 3
Digit [3] is: 4
Digit [4] is: 5
Digit [5] is: 6
Digit [6] is: 7
Digit [7] is: 8
Digit [8] is: 9
答案 3 :(得分:1)
将数字推入堆栈。
获得所有数字后,
sum = 0 ;
while( stack not empty ) {
pop the stack to get a digit
sum += digit
display digit
}
display sum
你说需要筹码吗?使用STL的堆栈:std::stack<int>
答案 4 :(得分:1)
digit = number % 10;
此操作将返回最右侧的数字。
所以当您尝试使用输入“1357”的应用程序时,在第一次运行while循环时,它将返回7.接下来它将返回5,依此类推。
如果您想要的只是各个数字的总和,那么您获得它们的顺序(并打印出来)将不会影响最终答案。如果您仍然希望它们以正确的顺序打印,您可以将数字存储在数组(或其他人提到的Vector或Stack)中,反转内容,然后遍历结构,打印出其内容。 / p>
答案 5 :(得分:0)
使用std :: stack存储单独的数字,然后打印出堆栈的内容。
这是一篇很好的文章:http://en.wikipedia.org/wiki/Stack_(data_structure)
这里是如何在C ++中使用堆栈:http://www.sgi.com/tech/stl/stack.html
答案 6 :(得分:0)
你将不得不以相反的顺序存储它们并打印出来,或者在递归调用之后进行一些递归并打印出来。
int printdigits(int number)
{
if (number == 0)
return 0;
int digit = number % 10;
int sum = printdigits(number / 10);
cout <<digit << " ";
return sum+digit;
}
答案 7 :(得分:0)
你的缩进是可怕的。也就是说,你的数字以相反顺序出现的原因非常简单:你得到的数字是相反的顺序。想一想:你将剩余的数字除以10,然后打印剩余部分。然后你将数字除以10 ...依此类推。您应该将数字存储在数组中,然后以相反的顺序打印数组。
学习缩进。
答案 8 :(得分:0)
作为一个总和并不重要,但是你使用的逻辑将它分开 从最不重要的数字到最重要的数字(并且是最简单的方式)。
答案 9 :(得分:0)
我将真诚地举例说明你不会重现它,如果这是一个家庭作业,那就把它作为学习的机会......
// reference: www.cplusplus.com
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
// What does this do?
template <typename T>
struct gen
{
gen(T start) : _num(start) {}
// Do we need these? But why have I commented them out?
//gen(gen const& copy) : _num(copy._num) {}
//gen& operator=(gen const& copy) { _num = copy._num; }
//~gen() {}
// Why do we do this?
T operator()() { T digit = _num % 10; _num /= 10; return digit; }
T _num;
};
// How is this different to the above?
template <typename T>
bool check_non_zero (T i)
{
return i != 0;
}
// And this? what's going on here with the parameter v?
template <typename T, int _size>
T sum_of_digits(T value, std::vector<T>& v)
{
// Why would we do this?
if (value == 0)
{
v.push_back(0);
return 0;
}
// What is the purpose of this?
v.resize(_size);
// What is this called?
gen<T> gen_v(value);
// generate_n? What is this beast? what does v.begin() return? where did _size come from?
generate_n(v.begin(), _size, gen_v);
// reverse? what does this do?
reverse(v.begin(), v.end());
// erase? find_if? what do they do? what the heck is check_non_zero<T>?
v.erase(v.begin(), find_if(v.begin(), v.end(), check_non_zero<T>));
// what the heck is accumulate?
return accumulate(v.begin(), v.end(), 0);
}
int main()
{
// What does this do?
vector<int> v;
// What is this peculiar syntax? NOTE: 10 here is because the largest possible number of int has 10 digits
int sum = sum_of_digits<int, 10>(123, v);
cout << "digits: ";
// what does copy do? and what the heck is ostream_iterator?
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "sum: " << sum << endl;
// other things to consider, what happens if the number is negative?
return 0;
}
答案 10 :(得分:0)
我用它来输入5个数字
int main () {
using namespace std;
int number
;`
cout << "Enter your digit: ";
cin >> number;
if (number == 0)
return 0;
int a = number % 10;
int second = (number / 10);
int b = second % 10;
int third = (second / 10);
int c = third % 10;
int fourth = (third / 10);
int d = fourth % 10;
int fifth = (fourth / 10);
int e = fifth % 10;
cout << e << " " << d << " " << c << " " << b << " " << a << endl;
return 0;
}
答案 11 :(得分:0)
一个简单的解决方案:
int n = 12345;
vector<int> digits;
while (n != 0) {
digits.insert(digits.begin(), n%10);
n /= 10;
}
for(auto & i : digits)
cout << i << " ";
输出: 1 2 3 4 5