再談大於指定正整數的最小「不重複數」問題

2021-09-08 09:46:49 字數 2867 閱讀 5400

對於「大於指定正整數的最小「不重複數」問題」,最初,在

演算法:求比指定數大且最小的「不重複數」問題的高效實現

中,我給出了乙個遞迴寫法,之後在同一篇博文中給出了乙個非遞迴寫法。

中對我的寫法進行了更詳細的說明,並進行了重要改進。使之適合範圍更大。

在 評playerc網友的"求比指定數大且最小的「不重複數」問題"

playerc的思路沒問題,但**複雜且存在錯誤。現在我按照這個思路給出我的寫法。

詳細的分析求解過程,就不在正文中描述了。**中有詳盡的注釋,在前幾篇博文中也進行了說明。這次寫法與前面的主要不同點的是,實現了只一次加0101……。

1 #include 2 #include 3

4#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 ...