簡體   English   中英

將數字的數字存儲在數組中

[英]storing digits of a number in array

如何將整數的不同數字存儲在任何數組中,例如 1234 到 {1,2,3,4} 可以使用char str[]="1234"; printf("%c",str[0]; 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()以確定其“大小”

  • 取它的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 }

我把詳細信息留給你填寫。

Carson 有一個類似的想法,它很好地避免了使用pow()

如果您的編譯器支持可變長度數組,那么您可以使用下面演示程序中顯示的方法

#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]);

如果要按順序存儲它們:

// 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;
}

當第一個答案出現時,我正在寫我的回復。 這將工作得很好。 中間的循環基本上通過刪除它前面的所有數字來隔離每個數字,然后在將其添加到數組之前將其划分到一個位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM