将小于正整数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行以内。

posted @ 2011-11-25 22:18  chng  阅读(297)  评论(0编辑  收藏  举报
BackToTop