代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

对整数的位数排序

c c++
  •  11
  • whacko__Cracko  · 技术社区  · 16 年前

    给你一个整数 51234 (比如)我们需要对输出的数字进行排序。 12345 .

    不使用数组怎么做?

    9 回复  |  直到 16 年前
        1
  •  28
  •   Carlos Gutiérrez    16 年前

    你可以用一个循环 % 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中的测试表明它处理零和重复数字:

    $ 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
    
        2
  •  6
  •   Dan    16 年前
    // 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
    
        3
  •  4
  •   Michael Burr    16 年前

    概述:

    • i=0至9的循环
    • 在每个循环迭代中,遍历数字中的数字(使用另一个执行“mod 10”操作的循环来剥离数字,直到数字减为零)-如果它与当前正在处理的数字匹配,请打印它

    唯一可能棘手的一点可能是正确处理零——您不需要太多,并且您需要处理输入为零的边缘情况。

    实际实现留作练习…

        4
  •  4
  •   Alok Singhal    16 年前

    容易的:

    #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中使用数组的公司工作。

        5
  •  4
  •   user231967    16 年前

    您根本不需要编写程序,只需使用shell命令即可:

    echo "51234" | sed 's+\(.\)+\1\n+g' | sort | tr -d '\n'
    
        6
  •  3
  •   Kirill V. Lyadvinsky    16 年前

    循环中给定整数除以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;
    }
    
        7
  •  1
  •   MSalters    16 年前

    当然,数组已经用完了,但我们有一个更好的容器:

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

    使用 multiset 如果您的输入包括以下数字: 887 应该打印为 788

        8
  •  0
  •   Aman Neelappa    16 年前

    可以尝试类似插入排序的方法。从本质上讲,创建一个新的数字,每次取一个旧的数字,并将其放在正确的位置。类似这样。

    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
    
        9
  •  0
  •   e.tadeu    16 年前

    在int(类似于vector)上创建一个容器接口,其中操作符引用第i个十进制数字。您还必须定义迭代器和其他东西。 然后调用std::排序。;)