zoukankan      html  css  js  c++  java
  • 将小于正整数N的数按字母顺序排序问题


      如题。要求:输入正整数N,将1到N-1的整数,按字母顺序排序。如,输入123,则排序结果为:1,10,100,101,……109,11,110,111,112,……119,120,121,122,13,14,15……19,2,20,……29,3,30,……39,4,40……99。作为只熟悉C、C++、JAVA语言编程的鄙人,才疏学浅,解决方案比较普通。

      定义一种特殊的加法,从N=1开始逐一输出(N++)即可。则关键问题是如何定义这种特殊的加法,使得加法的结果并非按数字大小排序,而是按字母顺序排序。设现在需要求"N+1"的值。如果N<=1或者N<=10,直接按1,2,……N-1输出即可否则,计算add(M, N, L),其中L代表n的长度(如两位数的长度是2,三位数长度是3,长度也就是数字的位数,则L=10^(位数-1),如,位数为3时,L的值是100),M是N的最高位数字,显然M最初为1,且必须随时跟踪N的最高位数字的变化。以下是具体代码:

     1 #include <iostream>
    2 using namespace std;
    3
    4 int add_1(int n, int m, int * l)
    5 {
    6 if( n*10 >= m )
    7 if( n%10 == 9 || (n+1)>=m )
    8 {
    9 *l = (*l)/10;
    10 return n/10+1;
    11 }
    12 else return n+1;
    13 *l = 10*(*l);
    14 return n*10;
    15 }
    16
    17 int len( int n )
    18 {
    19 int i=1;
    20 for(i=1; n/10; i*=10)
    21 n/=10;
    22 return i;
    23 }
    24
    25 int main()
    26 {
    27 int n, i = 1, m = 1;
    28 cin >> n;
    29 if( n<=1 || n <= 10 )
    30 while(i<n)
    31 cout << i++ << ends;
    32 else
    33 {
    34 int l = len(n);
    35 cout << 1 << ends;
    36 i = 1;
    37 while(i != (l-1))
    38 cout << i=add_1(i, n, &m) << ends;
    39 }
    40 return 0;
    41 }

    笔者有幸读过使用python,matlab等语言写的算法,行数在20行以内。

  • 相关阅读:
    题目1101:计算表达式
    九度oj 题目1107:搬水果
    [Hihocoder] 字符串排序
    [hzwer] 模拟T
    [Luogu] 宝藏
    [Luogu] 列队
    [Luogu] 奶酪
    [Luogu] 逛公园
    [Luogu] 时间复杂度
    [Luogu] 小凯的疑惑
  • 原文地址:https://www.cnblogs.com/zhchngzng/p/2263863.html
Copyright © 2011-2022 走看看