分隔整数 (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 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,令人惊讶的是,这还不是给定的(对于作业,我得到了行业论点(。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组