将数字分解为c

  • 本文关键字:分解 数字 c digits
  • 更新时间 :
  • 英文 :


我正在尝试创建一个程序,将一个数字分解成它的组成数字。

到目前为止,我写的代码如下:
#include <stdio.h>
int main() {
int num;
int digits;
int count = 1;
printf("Insert a positive number: ");
do {
scanf("%d", &num);
} while (num <= 0);
printf("In digits... n");
// Number in digits
while (num != 0) {
digits = num % 10;
printf("Digit %d --> %d n", count, digits);
num /= 10;
count++;
}
}

数字的数字正确打印,但顺序相反!

Insert a positive number: 345
In digits...
Digit 1 --> 5
Digit 2 --> 4 
Digit 3 --> 3 

我不知道如何解决这个问题,有人能帮我吗?

您正在打印对最后一位数字10进行mod处理的数字,然后将该数字除以10并重复直到该数字为零。所以它从右到左打印数字。
如果你想从左向右打印,你需要先打印十位的最高次数。这里有一个简单的方法,首先找到10的最高次幂,这个数有一个for,然后使用for循环从这个次幂到1,从左到右打印数字:

void print_digits(int n) {
int mask = 1;
for(int n2 = n; n2; n2 /= 10) mask *= 10; // find the left-most power of ten
for(int i = 1; mask > 1; mask /= 10) // loop over the mask to 1
printf("Digit %d --> %dn", i++, (n % mask) * 10 / mask);
// print the digit number and increment the digit counter
// extract and print the digit: 
//    `n % mask` gets rid of everything to the left
//    `* 10 / mask` gets rid of everything to the right
}

您还可以使用标准库函数sprintf(字符串打印格式化)来实现更简单的解决方案,将int放入字符串中,然后从中打印,如下所示:

void print_digits(int n) {
char num[11]; // 32-bit int up to 9 digits, possible '-', and  -> 11
sprintf(num, "%d", n);
for (int i = 0; num[i]; i++)
printf("Digit %d --> %cn", i + 1, num[i]);
}

第二个可能也会因为不涉及除法而稍微提高一点性能,但我不确定这一点,对于这样的问题,这些微小的差异无论如何都无关紧要

您的代码以相反的方式打印它们,因为您每次都从最右边的数字开始(通过对10取模),然后除以10。

要从左向右打印,您可以使用:

#include <stdint.h>
void print_uint32_digits(uint32_t val)
{
int started = 0; // Flag to say we have started printing digits
// Special case for when val is zero
if (val == 0u)
{
printf("0n");
return;
}
for (uint32_t divider = 1000000000u; divider != 0u; divider /= 10u)
{
uint32_t num = val / divider;
if (num > 0u || started)
{
printf("%c", num + '0');
started = 1;
val -= (num * divider);
}
}
printf("n");
}

一些注意事项-我使用uint32_t,因为它是无符号的和一个很好的长度。用简单的"ints"会涉及到处理负数的情况,这更复杂。我不知道你们是否需要处理负数。(此外,您的平台上的int可能是64位的,因此必须相应地调整初始分隔符。)

'started'标志用于当我们输出至少一个数字时发出信号,以确保正确打印零。在设置该标志之前,不打印前导零。

一个非常简单的递归解如下:

void print_num(int num)
{
if (num < 10)
fputc('0' + num, stdout);
else {
print_num(num/10);
print_num(num%10);
}
}

最新更新