преобразовать целое число в массив - PullRequest
9 голосов
/ 05 февраля 2009

Я пытаюсь преобразовать целое число в C в массив, содержащий каждую из цифр этого числа

т.е. если у меня есть

int number = 5400

как мне добраться до

int numberArray[4]

, где

numberArray[0] = 0;
numberArray[1] = 0;
numberArray[2] = 4;
numberArray[3] = 5;

Любые предложения с благодарностью получены.

Ответы [ 9 ]

14 голосов
/ 05 февраля 2009

Это будет работать для чисел> = 0

#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    int length = (int)floor(log10((float)number)) + 1;
    char * arr = new char[length];
    int i = 0;
    do {
        arr[i] = number % 10;
        number /= 10;
        i++;
    } while (number != 0);
    return arr;
}

РЕДАКТИРОВАТЬ: Просто немного больше стиля C, но более загадочным.

#include <math.h>

char * convertNumberIntoArray(unsigned int number) {
    unsigned int length = (int)(log10((float)number)) + 1;
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
    do {
        *curr++ = number % 10;
        number /= 10;
    } while (number != 0);
    return arr;
}
12 голосов
/ 05 февраля 2009

Подсказка: взгляните на этот предыдущий вопрос " Сумма цифр в C # ". Он объясняет, как извлечь цифры в числе, используя несколько методов, некоторые из которых относятся к C.

От Ответ Грега Хьюгилла :

/* count number of digits */
int c = 0; /* digit position */
int n = number;

while (n != 0)
{
    n /= 10;
    c++;
}

int numberArray[c];

c = 0;    
n = number;

/* extract each digit */
while (n != 0)
{
    numberArray[c] = n % 10;
    n /= 10;
    c++;
}
7 голосов
/ 05 февраля 2009

Вы можете вычислить количество цифр в целом числе с логарифмом, а не в цикле. Таким образом,

int * toArray(int number)
{
    int n = log10(number) + 1;
    int i;
    int *numberArray = calloc(n, sizeof(int));
    for ( i = 0; i < n; ++i, number /= 10 )
    {
        numberArray[i] = number % 10;
    }
    return numberArray;
}
1 голос
/ 04 ноября 2015

Попробуйте это,

void initialise_array(int *a, int size, int num) {
    for (int i = 0; i < size; ++i, num /= 10)
        a[(size - 1) - i] = num % 10;
}
1 голос
/ 05 февраля 2009

Если вам нужно учесть отрицательные числа, вам может потребоваться дополнительная логика. На самом деле, когда вы играете с массивами, вы не знаете размера начального уровня, вы можете захотеть сделать еще одну проверку безопасности, и добавить API для обработки структуры данных тоже очень удобно.

// returns the number of digits converted
// stores the digits in reverse order (smalles digit first)
// precondition: outputdigits is big enough to store all digits.
//
int convert( int number, int* outputdigits, int* signdigit ) {

  int* workingdigits = outputdigits;

  int sign = 1;
  if( number < 0 ) { *signdigit = -1; number *= -1; }
  ++workingdigits;

  for ( ; number > 0; ++ workingdigits ) {
    *workingdigits = number % 10;
    number = number / 10;
  }

  return workingdigits - outputdigits;
}

void printdigits( int* digits, int size, int signdigit ) {
  if( signdigit < 0 ) printf( "-" );

  for( int* digit = digits+size-1; digit >= digits; --digit ){
    printf( "%d", *digit );
  }
}

int main() {
   int digits[10];
   int signdigit;
   printdigits( digits, convert( 10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( -10, digits, &signdigit ), signdigit );
   printdigits( digits, convert( 1005, digits, &signdigit ), signdigit );

}
1 голос
/ 05 февраля 2009

Подсчитать количество цифр сложно, но при условии, что вы всегда можете сделать 4 цифры:

for (i = 0; i < 4; i++) {
  numberArray[i] = number%10;
  number = number div 10;
}
0 голосов
/ 09 февраля 2019
#include <stdio.h>
#include <string.h>

int main(void)
{
  int i, inputNumber;
  char* charArray;

  printf("\nEnter number: ");
  scanf("%d", &inputNumber);

  /* converts int to print buffer which is char array */
  sprintf(charArray, "%d", inputNumber); 
  int size = strlen(charArray);

  int intArray[size];

  for (i = 0; i < size; i++)
  {
    intArray[i] = charArray[i] - '0';
  }

  return 0;
}
0 голосов
/ 05 февраля 2009

используя код Вадима, я придумал эту тестовую программу:

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

char * convertNumberIntoArray(unsigned int number) {
    unsigned int length = (int)(log10((float)number)) + 1;
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
    do {
        *curr++ = number % 10;
        number /= 10;
    } while (number != 0);
    return arr;
}



int main(void)
{
    int InputNumber;
    int arr[5];

    printf("enter number: \n");
    scanf("%d", &InputNumber);

    convertNumberIntoArray(InputNumber);

    printf("The number components are: %d %d %d\n", arr[0],arr[1],arr[2]);

    system("PAUSE");    
    return 0;
}

но вывод мусор. Кто-нибудь может посоветовать, если я сделал что-то глупое здесь?

/***** output *****/
enter number:
501
The number components are: 2009291924 2009145456 -1
Press any key to continue . . .

- Дэйв

0 голосов
/ 05 февраля 2009

C код:

/* one decimal digit takes a few more than 3 bits. (2^3=8, 2^4=16) */
int digits[(sizeof (int) * CHAR_BIT) / 3 + 1], 
    *digitsp = digits;
do {
    *digitsp++ = number % 10;
    number /= 10;
} while(number > 0);

Вы увидите, сколько цифр вы преобразовали, взяв разницу

digitsp - digits

Если вы хотите поместить это в функцию:

#define MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT) / 3 + 1)

int to_array(int number, int *digits) {
    int *digitsp = digits;
    do {
        *digitsp++ = number % 10;
        number /= 10;
    } while(number > 0);
    return digitsp - digits;
}

int main() {
    int number = rand();
    int digits[MIN_DIGITS_IN_INT];
    int n = to_array(number, digits);

    /* test whether we're right */
    while(n-- > 0) 
        printf("%d", digits[n]);
    }
    printf(" = %d\n", number);
}

В этом случае я предпочитаю автоматические массивы динамическому распределению памяти, так как это проще сделать правильно, а не утечка случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...