分隔整数 (C++) 的数字

Separate the digits of an integer (C++)

本文关键字:数字 C++ 整数 分隔      更新时间:2023-10-16

>我需要编写一个程序,该程序将整数作为输入并输出,并用数字间隔输出。该算法工作正常,但以相反的顺序打印数字。为了获得原始订单,我使用了 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 enteredn";
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,令人惊讶的是,这还不是给定的(对于作业,我得到了行业论点(。