将数字的数字存储在数组中

storing digits of a number in array

如何在任何数组中存储整数的不同数字 像 1234 到 {1,2,3,4} 可以使用 char str[]="1234"; printf("%c",str[0]; 来完成 但是如何在不使用字符串和整数本身的情况下做到这一点

这是一个创建数字数组并将其打印出来的片段:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>


// Print digits 1 by 1
void numToDigits (int number, int base) {
  int i;
  int n_digits = (int)ceil(log(number+1) / log(base));
  printf("%d digits\n", n_digits);
  int * digits = calloc(n_digits, sizeof(int));

  for (i=0; i<n_digits; ++i) {
    digits[i] = number % base;
    number /= base;
  }

  // digits[0] is the 1's place, so print them starting from the largest index

  for (i=n_digits-1; i>=0; --i) {
    printf("%d", digits[i]);
  }
  printf("\n");

  free(digits);
}

您可能想要修改它,但我认为它揭示了所有重要的想法。编译时不要忘记添加 -lm 以包含 logceil 所需的数学库。另请注意,打印代码不适用于大于 10 的基数。

这是一种或多或少的方法:

  • 取整数的log10()确定其'size'

  • floor() 得到指数(位数 - 1)

  • 然后用(int)pow(10, exponent)

    计算最高分频器
  • 终于有了一个 for 循环:

    int value = 1234; // Your value to split up in digits.
    for (int d = divider; divider > 0; divider /= 10)
    {
        int digit = value / d;
        value = value / 10;
    
        // Store digit in array
    }
    

详情留给你填写

当第一个答案出现时,我正在写我的回复。这会很好用。中间的循环基本上隔离了每个数字,方法是删除它前面的所有数字,然后在将其添加到数组之前将其划分到个位。

如果您的编译器支持可变长度数组,那么您可以使用下面演示程序中显示的方法

#include <stdio.h>

enum { Base = 10 };

size_t size( unsigned int x )
{
    size_t n = 0;
    do { ++n; } while ( x /= Base );

    return n; 
}

int main( void )
{
    unsigned int x = 0;

    printf( "Enter a non-negative number: " );
    scanf( "%u", &x );

    size_t n = size( x );
    unsigned int digits[n];

    for ( size_t i = n; i != 0; x /= Base )
    {
        digits[--i] = x % Base;
    }

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%u", digits[i] );
    }
    putchar( '\n' );
}

程序输出可能看起来像

Enter a non-negative number: 123456789
123456789

如果编译器不支持可变长度数组,那么您将需要动态分配数组,例如

unsigned int *digits = malloc( n * sizeof( unsigned int ) );

您不需要在运行时计算给定整数 n 中有多少位。您可以检查编译器的 <limits.h> 以了解 int 可以容纳的最大位数。

int n = 124343;
int digits[10]; // INT_MAX is 10-digit long on x86 and x64 (GCC and Clang)
int ndigits;

另一种解决方法是 (@chux)使用宏的最大位数:

#define INT_DIGIT10_WIDTH ((sizeof(int)*CHAR_BIT - 1)/3 + 1)
int digits[INT_DIGIT10_WIDTH];

剩下的很简单:

// Digits are stored in reverse order
for (ndigits = 0; n; n /= 10)
    digits[ndigits++] = n % 10;

for (int i = ndigits - 1; i > 0; --i)
    printf("%d\t", digits[i]);

如果你想存储它们in-order:

// Digits are stored in reverse order
for (ndigits = 0; n; n /= 10)
    digits[ndigits++] = n % 10;

// Reverse digits by swapping every two parallel elements
for (int i = 0, j = ndigits-1; i < j; ++i, --j) {
    int tmp = digits[i];
    digits[i] = digits[j];
    digits[j] = tmp;
}

for (int i = 0; i < ndigits; ++i)
    printf("%d\t", digits[i]);

这里有一个稍微不同的方法。虽然它没有考虑整数的大小,但它是直截了当的并将每个数字存储在数组中,同时从左到右移动数字:

/* store the separate digits of an integer in the elements of an integer array
*/

#include <stdio.h>

int main (void)
{
    int number = 1234500;
    printf("\nnumber = %d\n\n", number);

    int nDigits = 1;
    int power = 1;          // power = mult of 10 matching left digit
    while (number / power > 9) {
        ++nDigits;
        power *= 10;    
    }

    int digits[10];
    for (int i = 0; i < nDigits; ++i) {
        digits[i] = number / power;
        number %= power;        // drop left-most digit from number 
        power /= 10;        // adjust multiple of 10
    }

    for (int i = 0; i < nDigits; ++i) {
        printf("digits[%d] = %d\n", i, digits[i]);
    }

    return 0;
}