2020年3月20日 星期五

3.1-Occurrenc Counting

解題心得:
開兩個陣列,一個紀錄數字,一個紀錄該數字出現次數。
每當有新的輸入時,就找一次當前紀錄陣列,如果已被記錄過就出現次數加一,沒有則放到最後面。
最後,從數字最大的開始輸出,輸出後把該數出現次數歸零,且把紀錄最大值的變數重設數質(不設零是因為有小於零的數)

程式碼:
#include <iostream>
using namespace std;

int main()
{
 int number[100] = { 0 }, times[100] = { 0 };
 int n, flag = 0, check, maxNumber = -100000; // flag records current array's length 

 while (cin >> n)
 {
  check = 0; // check if this number has been recorded
  for (int i = 0; i < flag; i++)
  {
   if (n == number[i])
   {
    times[i]++;
    check = 1;
    break;
   }
  }
  if (check == 0) // if number is new
  {
   number[flag] = n;
   times[flag]++;
   flag++;
  }

  if (n > maxNumber) // find max number
   maxNumber = n;
 }

 cout << "N\tcount" << endl;
 for (int i = 0; i < flag; i++)
 {
  for (int j = 0; j < flag; j++)
  {
   if (number[j] == maxNumber)
   {
    cout << number[j] << "\t" << times[j] << endl;
    times[j] = 0;
    maxNumber = -100000;
   }

   for (int k = 0; k < flag; k++)
   {
    if (number[k] > maxNumber && times[k] != 0)
     maxNumber = number[k];
   }
  }

 }

 return 0;
}


另解
#include <iostream>
using namespace std;

int main() {
 int n, arr[100], len = 0, occur[100] = { 0 };
 while (cin >> n)
 {
  int not_occur = 1;
  for (int i = 0; i < len; i++)
  {
   if (n == arr[i])
   {
    occur[i]++;
    not_occur = 0;
    break;
   }
  }
  if (not_occur)
  {
   arr[len] = n;
   occur[len]++;
   len++;
  }
 }
 for (int i = 0; i < len; i++)
 {
  for (int j = 0; j < len; j++)
  {
   if (arr[i] > arr[j])
   {
    swap(arr[i], arr[j]);
    swap(occur[i], occur[j]);
   }
  }
 }
 cout << "N\tcount" << endl;
 for (int i = 0; i < len; i++)
 {
  cout << arr[i] << "\t" << occur[i] << endl;
 }
    return 0;
}

沒有留言:

張貼留言