繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM