[英]Separate the digits of an integer (C++)
我需要编写一个程序,该程序将一个整数作为输入并以数字间隔输出它。 该算法工作正常,但以相反的顺序打印数字。 为了获得原始顺序,我使用了 for 循环。 问题是它什么也不打印。
#include <iostream>
using namespace std;
int countDigit(int n)
{
int count = 0;
while (n != 0) {
n = n / 10;
++count;
}
return count;
}
int main()
{
int Num ;
int sum = 0;
int arr[100];
cout <<"Enter an integer: " ;
cin >> Num ;
int c = countDigit(Num) ;
for (int i = c; i > 0; i--)
{
arr[i] = (Num % 10);
Num = (Num / 10);
sum += arr[i];
}
cout << " Your digits:";
for (int x = 1 ; x <= c; x++)
{
cout << arr[x] << " " ;
cout << sum ;
}
return 0;
}
我的问题在这里
for (int x = 1 ; x <= c; x++)
{
cout << arr[x] << " " ;
cout << sum ;
}
它什么也不打印。 可能是什么问题呢 ?
使用的输入是 1234 预期的输出是 1 2 3 4
对于初学者来说,函数countDigit
是错误的。
int countDigit(int n)
{
int count = 0;
while (n != 0) {
n = n / 10;
++count;
}
return count;
}
对于具有一位数的有效数字 0,它返回 0。
该函数可以如下所示
size_t countDigit( int n, int base = 10 )
{
size_t count = 0;
do
{
++count;
} while ( n /= base );
return count;
}
在这个循环中
for (int i = countDigit(Num); i > 0; i--)
{
arr[i] = (Num % 10);
Num = (Num / 10);
sum += arr[i];
}
变量Num
已更改。 所以在下一个循环中
for (int x = 1 ; x <= countDigit(Num) ; x++)
{
cout << arr[x] << " " ;
cout << sum ;
}
它不会有原始值您需要使用中间变量来进行计算。
还要考虑到使用可以输入负数。
编辑:更新代码后,您还需要从循环中移动总和的输出
for (int x = 1 ; x <= c; x++)
{
cout << arr[x] << " " ;
}
cout << sum ;
而不是大整数数组,最好使用std::string
类型的对象。
这是一个演示程序
#include <iostream>
#include <string>
size_t countDigit( int n, int base = 10 )
{
size_t count = 0;
do
{
++count;
} while ( n /= base );
return count;
}
int main()
{
const int Base = 10;
int num;
std::cout << "Enter an integer: ";
std::cin >> num;
size_t count = countDigit( num );
std::string s( count, ' ' );
int sum = 0;
for ( ; count-- != 0; num /= Base )
{
int digit = num % Base;
if ( digit < 0 ) digit = -digit;
s[count] = digit + '0';
sum += digit;
}
std:: cout << "Your digits: ";
for ( const auto &c : s ) std::cout << c << ' ';
std::cout << '\n';
std::cout << "The sum of digits is " << sum << '\n';
return 0;
}
它的输出可能看起来像
Enter an integer: -123456789
Your digits: 1 2 3 4 5 6 7 8 9
The sum of digits is 45
另一种方法是编写一个输出数字并返回数字总和的递归函数。
#include <iostream>
unsigned int recursive_sum( long long int n, long long int base = 10, std::ostream &os = std::cout )
{
long long int digit = n % base;
if ( digit < 0 ) digit = -digit;
unsigned int sum = digit + ( ( n /= base ) == 0 ? 0 : recursive_sum( n ) );
os << digit << ' ';
return sum;
}
int main()
{
int num;
std::cout << "Enter an integer: ";
std::cin >> num;
unsigned int sum = recursive_sum( num );
std::cout << '\n';
std::cout << "The sum of digits is " << sum << '\n';
return 0;
}
同样,程序输出可能看起来像
Enter an integer: -123456789
1 2 3 4 5 6 7 8 9
The sum of digits is 45
这给出了预期的输出。 我将 countDigit(Num) 分配给 c 并将总和写入循环外。
int main()
{
int Num ;
int sum = 0;
int arr[100];
cout <<"Enter an integer: " ;
cin >> Num ;
int c = countDigit(Num); //edit 1
// extracts the digits
for (int i = c; i > 0; i--)
{
arr[i] = (Num % 10);
Num = (Num / 10);
sum += arr[i];
}
cout << "Your digits with spaces: ";
// reverses the order
for (int x = 1 ; x <= c ; x++)
{
cout << arr[x] << " " ;
}
cout << endl << "The sum of the digits is: " << sum ; // edit 2
return 0;
}
这是一个较短的版本:
#include <concepts>
#include <cstdio>
#include <string>
template <std::integral T>
void printDigits(T const i) {
for (auto const ch : std::to_string(i)) {
std::printf("%c ", ch);
}
std::fflush(stdout);
}
这是一个使用字符串的方法。
#include <iostream>
#include <string>
int main()
{
std::string input;
std::size_t location;
std::cout << "Enter an integer: ";
std::getline(std::cin, input);
std::stoi(input, &location); // Don't care about the integer, just location
if (location != input.length()) {
std::cout << "Invalid Entry: Non-integer entered\n";
return 1;
}
for (auto i : input) {
std::cout << i << ' ';
}
// Here's a one liner that requires <algorithm>
// std::for_each(input.begin(), input.end(), [](auto i) { std::cout << i << ' '; });
std::cout << '\n';
}
我根本不在乎整数。 我可以验证是否只输入了数字,如果没有则提前退出。 我需要的唯一循环是用于打印。
stoi()
可以返回整数,但我不关心整数。 我只想知道转换了多少个字符,我通过将输出参数位置提供给它来了解这一点。 检查该位置与字符串长度相同可确保仅输入数字。 没有小数点,没有多余的字母,只有数字。
需要注意的是,如果这是一项任务,这可能不符合您的要求。 它还需要 C++11,令人惊讶的是,它还没有给出(对于作业,我得到了行业论据)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.