2015年2月8日 星期日

P2A練習02/05

P2A 2015/02/05練習:讀入n個數,問數字相同的個數最多幾個?

以下為第(2)種方法的程式碼,另附測試檔 a.txt b.txt c.txt 
a共110個數字{有5個5} 、  b共10000個數字{有6個100}、 c共10000個數字{有8個98765432}

/*
p2a 02/05 練習:若有 N 個數 A[0],A[1],.....A[N-1],求重複最多的個數
例 有10個數 1,2,3,4,5,2,3,4,5,2,最多為3個 {註:2有3個}
本題(1) 若A[0]~A[N-1]的範圍不大<10^6的話{假設為M},可用空間換取時間,直接宣告C[M]來計數即可,
  (2) 但若範圍太大{0~10^9 },而N不太大<10^4的話,可將A陣列排序後,以下列程式碼來計算最多個數
(3) 也可以使用類似 b05的解法
*/
#include <iostream>
#include <algorithm>  // 使用 sort 需用
using namespace std;
int main()
{
  int i,n, a[10000];
  cin >> n ;
  for(i=0; i<n; ++i)  cin >> a[i];    // 讀入 a 陣列
  sort(a,a+n);                       // 將 a 陣列由小至大排序
// 計算連續相同的數字
  int ans = 1;
  for(i=1;i<n-1;++i)
  {
if( a[i] == a[i-ans] ) ++ ans;
// 當ans為1 若a[i]與前a[i-1]相同,則 ans+1就是長度為2
// 當ans為2 若a[i]與前a[i-2]相同,則 ans+1就是長度為3
// 當ans為 k 若a[i]與前a[i-k]相同,則 ans+1就是長度為 K+1
      //  若沒有比 k 長的相同數字, ans 不會再加
  }
cout << "最多相同數共 " << ans << "個\n";
  return 0;
}
/*
範例輸入
10
1 2 3 4 5 2 3 4 5 2
範例輸出
3
*/

0 意見:

張貼留言