преобразуйте целое число в массив

Если ваш скрипт успешно работал в течение нескольких часов, я думаю, что это может быть одним из параметров конфигурации вашей базы данных, просмотрите вашу конфигурацию с этим предложением,

SHOW GLOBAL VARIABLES where variable_name like'%time%';

Может быть, это много соединений или, может быть, тайм-аут сеанс, но я уверен, что это проблема вашего сервера MySQL

9
задан RudolfJelin 29 May 2017 в 10:21
поделиться

7 ответов

Это работало бы на числа> = 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;
}
13
ответ дан 4 December 2019 в 06:41
поделиться

Выяснение количества цифр хитро, но принятие это всегда - 4 цифры, которые можно сделать:

for (i = 0; i < 4; i++) {
  numberArray[i] = number%10;
  number = number div 10;
}
1
ответ дан 4 December 2019 в 06:41
поделиться

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

Из ответа Greg Hewgill:

/* 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++;
}
12
ответ дан 4 December 2019 в 06:41
поделиться

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

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;
}
7
ответ дан 4 December 2019 в 06:41
поделиться

Если необходимо принять отрицательные числа во внимание, Вам, возможно, понадобилась бы некоторая дополнительная логика. На самом деле при проигрывании вокруг с массивами Вы не знаете размера первичных, можно хотеть сделать еще некоторую проверку безопасности и добавление, что 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
ответ дан 4 December 2019 в 06:41
поделиться

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

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

0
ответ дан 4 December 2019 в 06:41
поделиться

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

#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 . . .

- dave

0
ответ дан 4 December 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: