完整**如下
在這裡插入#include
intmain()
for(i=
0;i}//以上為陣列排序功能,以下為核心**
for(i=
0;i1;i++
) i--
;//i--可是重點,如果前位與后位一旦相當,經過提前之後還要判斷原來位與新後衛是否相等。
//比如
n--;}
}for
(i=0
;i)return0;
}
核心**如下
if
(a[i]
==a[i+1]
) i--
;//i--可是重點,如果前位與后位一旦相當,經過提前之後還要判斷原來位與新後衛是否相等。
n--;}
}
首先,此演算法中有個點需要注意,i在- -,同時n也必定- -;
案例演算:
案例 111223
前位與后位相等,提前一次
11223,但此時i沒有- -,i順利變為了1
顯然arr[1]= arr[2]
所以一旦發生前衛等於后位的情況,一定要i - -
原理:從原來發生相等的位置繼續與後位作比較,相當於每次一直提前,直到前位不等於后位才可以從下一位數字作為比較起點與之後的數字比較。
即每次做比較的位置為起點,直到只剩下它自身乙個數的時候才移動起點。
同時n也一定要- -,因為最終的情況一定是 123333
尾數肯定是相等的,如果沒有n --,3始終等於後面的3
,i始終- - 後又+ +
進入死迴圈
當然,如果覺得抽象,從簡單角度理解,11223>>12233>>12333,每做一次提前處理就多出來乙個不屬於原陣列的尾巴,原陣列可沒有那麼多3,砍掉就好了
補充以上只是從小到大排了不重複序,下面為修改後可以統計的**片段
for
(i=0
;i)for
(i=0
;i1;i++
) b[i]++;
//第一位的數字一共出現了幾次,經過不斷提前後,換到下乙個起點i才++,此時第二位的數字就是第二種數字
i--;//i--可是重點,如果前位與后位一旦相當,經過提前之後還要判斷原來位與新後衛是否相等。
//比如
n--;}
}for
(i=0
;i)return0;
}
統計素數個數
題目描述 詢問 a,b 中素數的個數。輸入描述 輸入兩個整數a b a,b 5000000 輸出描述 輸出乙個數,表示答案。樣例輸入 3 5 樣例輸出 2源 include int left,right,ans 0 num 0 prime 350000 bool flag 5000001 void ...
1439 統計素數個數
時間限制 1 s 空間限制 1000 kb 題目等級 青銅 bronze 輸入區間 l,r 尋找在此區間內的質數。輸入描述 input description 開區間 l,r 中的整數l,r 輸出描述 output description 在此區間中所有質數的個數n 樣例輸入 sample inpu...
單鏈表統計偶數個數
單鏈表統計偶數個數 6分 本題要求實現乙個函式,返回帶頭結點的單鏈表中偶數的個數。int evennumber linklist l l是帶頭結點的單鏈表的頭指標,函式evennumber返回l中偶數的個數。如果單鏈表為空,返回0。其中linklist結構定義如下 typedef struct ln...