Вам дают целое число 51234
(скажите), что мы должны отсортировать цифры числа, которым будет вывод 12345
.
Как сделать это, не используя массив?
Вы можете использовать петлю и % 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
можно попробовать что-то вроде вставки. По сути, создайте новый номер от принятия одной цифры старого одновременно и положить его в правильное место. Что-то вроде этого.
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
// 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
Общий общий обзор:
, единственный потенциально сложный бит может быть должным образом обработать Zeros - вы тоже не хотите Многие, и вы захотите обрабатывать краевой случай, когда вход будет правильно нулевым.
Фактическая реализация оставлена как упражнение ...
Легко:
#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.
.Вам не нужно писать программу вообще, просто сделайте это с командами Shell:
echo "51234" | sed 's+\(.\)+\1\n+g' | sort | tr -d '\n'
Зачастую, если у вас есть ваши генераторные точки в случайных местах в растровом изображении, любая нерандемность будет легко разглядеть на глаз как комкинга, полосы или линии.
-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;
}
Уверенные массивы внены, но в любом случае у нас есть лучший контейнер:
void foo(unsigned i) {
std::set<char> digits;
do {
digits.insert(`0` + i % 10);
i /= 10;
while(i!=0);
}
Использование MultiSet
Если ваш вход включает в себя такие номера 887
, который должен быть напечатан как 788
Создайте интерфейс контейнера по INT (что-то вроде вектора), где оператор ссылается на десятичную цифру. Вы должны были бы определить итераторы и другие вещи тоже. Затем позвоните STD :: Сортировать по нему. ;)