Сортировка цифр целого числа

Вам дают целое число 51234 (скажите), что мы должны отсортировать цифры числа, которым будет вывод 12345.

Как сделать это, не используя массив?

11
задан whacko__Cracko 25 January 2010 в 07:05
поделиться

9 ответов

Вы можете использовать петлю и % 10 для извлечения каждая цифра. Наружная петля от 0 до 9 может быть использована для проверки, если цифра существует. Если он существует, распечатайте его.

В псевдо-коде:

n = integer // 51234
FOR digit = 0 TO 9
  temp = n
  REPEAT
    IF temp % 10 = digit THEN PRINT digit
    temp /= 10
  UNTIL temp = 0

Редактировать: Этот тест в GCC показывает, что он обрабатывает Zeros и повторные цифры:

$ cat sortdigits.c
#include <stdio.h>
main () {
 int n,digit,temp;
 n = 43042025;
 for (digit=0;digit<9;digit++)
   for (temp=n;temp>0;temp/=10)
     if (temp%10==digit) printf("%d",digit);
 printf("\n");
}
$ ./sortdigits
00223445
28
ответ дан 3 December 2019 в 00:59
поделиться

можно попробовать что-то вроде вставки. По сути, создайте новый номер от принятия одной цифры старого одновременно и положить его в правильное место. Что-то вроде этого.

while(num!=0){

dig = num%10; // get the last digit 
if(newNum=0 ) newNum+=dig;
else{
    newNumTemp = 0; flag =1;i =1;
    while (newNum != 0){
    Newdig = newNum%10;
   if(flag){
      if (Newdig >= dig )
         {NewNumTemp = Newdig*(10^i)+ NewNumTemp; }
      else { flag=0; NewNumTemp = dig*(10^i) +NewNumTemp; i++;NewNumTemp = Newdig*   (10^i)+    NewNumTemp;}

     } // end of outer if 
     i++;
     newNum/=10;

   } // end of while
   newNum= newNumTemp;
}// end of else 

num/=10;

}// end of outer while
0
ответ дан 3 December 2019 в 00:59
поделиться
// Bubblesort
long sortNum(long n) {
  while (true) {
    long a = n % 10, p = 9;
    bool s = false;
    for (long r = n / 10; r; r/= 10) {
      long b = r % 10;
      if (a < b) {
        n -= p * (b - a);
        s = true;
      } else a = b;
      p *= 10;
    }
    if (!s) return n;
  }
}

#include <iostream>

int main(int argc, char **argv) {
  if (argc > 1) {
    long n = strtol(argv[1], 0, 0);
    std::cout << "Unsorted: " << n << std::endl;
    n = sortNum(n);
    std::cout << "Sorted:   " << n << std::endl;
  }
  return 0;
}

$ g++ -Wall -Wextra bubble-int.cpp && ./a.exe 183974425
Unsorted: 183974425
Sorted:   123445789
6
ответ дан 3 December 2019 в 00:59
поделиться

Общий общий обзор:

  • цикл для i = от 0 до 9
  • в каждой итерации цикла, пройдите по цифрам в номере (используя другой цикл, который делает мод 10 «Операция, чтобы очистить цифры до тех пор, пока число не уменьшится до нуля) - если он соответствует цифру, вы в настоящее время работаете, напечатайте его

, единственный потенциально сложный бит может быть должным образом обработать Zeros - вы тоже не хотите Многие, и вы захотите обрабатывать краевой случай, когда вход будет правильно нулевым.

Фактическая реализация оставлена ​​как упражнение ...

4
ответ дан 3 December 2019 в 00:59
поделиться

Легко:

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

static void pput(int n, int c)
{
    int i;
    for (i=0; i < n; ++i) putchar(c);
}

int main(int argc, char *argv[])
{
    int zeros = 0;
    int ones = 0;
    int twos = 0;
    int threes = 0;
    int fours = 0;
    int fives = 0;
    int sixes = 0;
    int sevens = 0;
    int eights = 0;
    int nines = 0;
    long num = 0;

    if (argc > 1) {
        char *eptr;
        num = strtol(argv[1], &eptr, 0);
        if (*eptr) {
            fprintf(stderr, "Invalid number: '%s', using 0.\n", argv[1]);
            num = 0;
        }
    }
    do {
        switch (num % 10) {
            case 0: ++zeros;
                    break;
            case 1: ++ones;
                    break;
            case 2: ++twos;
                    break;
            case 3: ++threes;
                    break;
            case 4: ++fours;
                    break;
            case 5: ++fives;
                    break;
            case 6: ++sixes;
                    break;
            case 7: ++sevens;
                    break;
            case 8: ++eights;
                    break;
            case 9: ++nines;
                    break;
            default:
                    break;
        }
    } while ((num /= 10));
    pput(zeros, '0');
    pput(ones, '1');
    pput(twos, '2');
    pput(threes, '3');
    pput(fours, '4');
    pput(fives, '5');
    pput(sixes, '6');
    pput(sevens, '7');
    pput(eights, '8');
    pput(nines, '9');
    putchar('\n');
    return 0;
}

Компиляция и работа:

$ gcc -Wextra -Wall -ansi -pedantic -Wfloat-equal -Wundef -Wshadow \
  -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes \
  -Wswitch-default -Wswitch-enum -Wstrict-overflow=5 \
  -Wdeclaration-after-statement -Wwrite-strings -Wconversion \
  -Waggregate-return -Wunreachable-code a.c
$ ./a.out
0
$ ./a.out 54321
12345
$ ./a.out 9834346
3344689
$ ./a.out hello
Invalid number: 'hello', using 0.
0

: -)

Другое решение, не использующее массивы, а довольно короткие в строке:

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

int main(int argc, char *argv[])
{
    long num = 0;
    int i;
    size_t *freq;

    if (argc > 1) {
        char *eptr;
        num = strtol(argv[1], &eptr, 0);
        if (*eptr || errno == ERANGE) {
            fprintf(stderr, "Invalid number: '%s', using 0.\n", argv[1]);
            num = 0;
        }
    }

    if ((freq = calloc(10, sizeof *freq)) == NULL) {
        perror("malloc failure");
        return EXIT_FAILURE;
    }

    do
        ++freq[num % 10];
    while ((num /= 10));

    for (i=0; i < 10; ++i) {
        size_t j;
        for (j=0; j < freq[i]; ++j)
            putchar(i + '0');
    }
    putchar('\n');
    free(freq);

    return EXIT_SUCCESS;
}

Да, я знаю, что «правильное» решение Отказ Но почему один не использует массивы для этой проблемы? Как сказал один из комментаторов, я не хотел бы работать на компанию, которая не позволила бы мне использовать массивы в C.

.
4
ответ дан 3 December 2019 в 00:59
поделиться

Вам не нужно писать программу вообще, просто сделайте это с командами Shell:

echo "51234" | sed 's+\(.\)+\1\n+g' | sort | tr -d '\n'
4
ответ дан 3 December 2019 в 00:59
поделиться

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

-121--1389147-

Разделите на 10 заданных целых в цикле. Распечатайте напоминание в каждой итерации.

Или «Сортировать» означает, что здесь? Для реальной сортировки вам понадобится две петли. Один из них будет от 0 до 9. Другим будет то, что было описано рано.

int main()
{
    int x = 0;
    cin >> x;

    for ( int l = 0; l < 10; ++l )
    {
        int rem = x % 10;
        int tx = x / 10;
        while ( rem || tx )
        {
            if ( rem == l ) cout << rem;
            rem = tx % 10;
            tx = tx / 10;
        }
    }
    cout << endl;
}
3
ответ дан 3 December 2019 в 00:59
поделиться

Уверенные массивы внены, но в любом случае у нас есть лучший контейнер:

void foo(unsigned i) {
  std::set<char> digits;
  do {
    digits.insert(`0` + i % 10);
    i /= 10;
  while(i!=0);
}

Использование MultiSet Если ваш вход включает в себя такие номера 887 , который должен быть напечатан как 788

1
ответ дан 3 December 2019 в 00:59
поделиться

Создайте интерфейс контейнера по INT (что-то вроде вектора), где оператор ссылается на десятичную цифру. Вы должны были бы определить итераторы и другие вещи тоже. Затем позвоните STD :: Сортировать по нему. ;)

0
ответ дан 3 December 2019 в 00:59
поделиться