對於「大於指定正整數的最小「不重複數」問題」,最初,在
演算法:求比指定數大且最小的「不重複數」問題的高效實現
中,我給出了乙個遞迴寫法,之後在同一篇博文中給出了乙個非遞迴寫法。
中對我的寫法進行了更詳細的說明,並進行了重要改進。使之適合範圍更大。
在 評playerc網友的"求比指定數大且最小的「不重複數」問題"
playerc的思路沒問題,但**複雜且存在錯誤。現在我按照這個思路給出我的寫法。
詳細的分析求解過程,就不在正文中描述了。**中有詳盡的注釋,在前幾篇博文中也進行了說明。這次寫法與前面的主要不同點的是,實現了只一次加0101……。
1 #include 2 #include 34#define size(x) (sizeof (x) / sizeof (x)[0])
5#define be_dig(x) ( '0' <= x && x <= '9' )
6#define max 128
78 typedef struct9
14number ;
1516
void input( number *);
17void reverse( unsigned char * , unsigned char *);
18void exchange( unsigned char * , unsigned char *);
19void squeeze( unsigned char * , unsigned char * *);
20void output( const unsigned char * , const unsigned char *) ;
21void seek( unsigned char * , unsigned char * *);
22void add_1( unsigned char * , unsigned char * *);
23 unsigned char * search ( unsigned char * , unsigned char *);
2425
int main( void
) 26 35
36/*
37輸入數字到 p_n -> digs陣列 ,p_high 記錄最高位位置
38*/
39void input( number *p_n )
4056
57/*
58將從p_b指向的數字到p_e指向的數字逆序排列。123 -> 321
59*/
60void reverse( unsigned char * p_b , unsigned char *p_e )61
6566
void exchange( unsigned char * p1 , unsigned char *p2 ) 67
7273
/*74
去掉多餘的高位0。00123 -> 123
75*/
76void squeeze( unsigned char * p_b , unsigned char * *pp_e )77
8182
/*83
* p_l指向最低位,* pp_h指向最高位
8485
(a)首先最左位加1 (left) 2 2 1 1 => 3 2 1 1
86由高到低查詢重複位 3 2 (1) 1
87新的區間為 (left)(1) 1
88轉到(a) 3 2 (2) 1
89(2) 1間沒有重複數字,迴圈結束
9091
從 left-1 到 p_l 寫010101……
92*/
93void seek( unsigned char * p_l , unsigned char * *pp_h )
94103
while ( ( break_p = search ( left , * pp_h ) ) != null );//
null:不能找到重複數字
104105
//從 left-1 到 p_l 寫010101……
106while ( left >p_l )
107111
}112
113/*
114加1。處理了可能的進製,以及pp_h所指向的記錄最高位位置指標可能的改變
115*/
116void add_1( unsigned char * p_l , unsigned char * *pp_h )
117124
if ( * * pp_h > 9 ) //
最高位有進製
125129
}130
131/*
132搜尋p_h到p_l所指向數字中第乙個重複數字的位置,如無則返回null
133*/
134 unsigned char * search ( unsigned char * p_l , unsigned char *p_h )
135145
146if ( * p_l == p_l[1
] )147
return
p_l ;
148149
return
null ;
150}
151152
/*153
輸出p_h指向的數字到p_l指向的數字
154*/
155void output( const unsigned char * p_h , const unsigned char *p_l )
156
再談大於指定正整數的最小「不重複數」問題
對於 大於指定正整數的最小 不重複數 問題 最初,在 演算法 求比指定數大且最小的 不重複數 問題的高效實現 中,我給出了乙個遞迴寫法,之後在同一篇博文中給出了乙個非遞迴寫法。中對我的寫法進行了更詳細的說明,並進行了重要改進。使之適合範圍更大。在 評playerc的 求比指定數大且最小的 不重複數 ...
3029 不重複正整數
單點時限 2.0 sec 記憶體限制 256 mb 整數拆分是把乙個正整數 簡稱為和數 拆分為乙個或若干個指定正整數 簡稱為零數,通常不區別式中各零數的排列順序 之和,這是乙個有趣的計算問題。通常拆分式中的零數有重複和不重複 即拆分式中各零數互不相同 兩種情況。如果我們打算將乙個給定的正整數 n n...
大於K的最小正整數 的一種解法
23 google2009華南地區筆試題 給定乙個集合a 0,1,3,8 該集合中的元素都是在0,9之間的數字,但未必全部包含 指定任意乙個正整數k,請用a中的元素組成乙個大於k的最小正整數。比如,a 1,0 k 21 那麼輸出結構應該為100。int findmorethan int p,int ...