Board logo

標題: 輸出整數陣列第三大數 [打印本頁]

作者: may    時間: 2022-12-11 23:30     標題: 輸出整數陣列第三大數

用排序法寫
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void bubble_sort(int arr[], int len) {//自訂函數由大而小排序
  4.     int i, j, temp;
  5.     for (i = 0; i < len - 1; i++)
  6.         for (j = 0; j < len - 1 - i; j++)
  7.             if (arr[j] < arr[j + 1]) {
  8.                 temp = arr[j];
  9.                 arr[j] = arr[j + 1];
  10.                 arr[j + 1] = temp;
  11.             }
  12. }
  13. int main() {
  14.     int n;
  15.     printf("Enter array length:");
  16.     scanf("%d",&n);
  17.     int arr[n] ;
  18.     for(int i=0;i<n;i++)
  19.         scanf("%d",&arr[i]);
  20.     //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
  21.     bubble_sort(arr, n);//呼叫函數由大而小排序
  22.     int i;
  23.     int r=1;//最大數的r值設定為1
  24.     for (i = 1; i < n; i++){//從第2大數開始拜訪
  25.         r++;//每拜訪一個,r就加1
  26.         if(arr[i]==arr[i-1])//如果該數重覆出現
  27.             r--;//r就不要加1
  28.         if(r==3){//如果r值是3
  29.             printf("The result is %d. ", arr[i]);//找到第3大數
  30.             break;//離開迴圈,不必再找了
  31.          }
  32.     }

  33.         if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
  34.            printf("The result is %d. ", arr[0]);//輸出最大數

  35.     return 0;
  36. }
複製代碼
排序的方法有很多,以下是用選擇排序法寫:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void selection_sort(int arr[], int len) {//自訂函數由大而小排序
  4.     int i, j, temp;
  5.     for (i = 0; i < len - 1; i++)
  6.         for (j = i+1; j < len; j++)
  7.                 if (arr[i] < arr[j ]) {
  8.                 temp = arr[j];
  9.                 arr[j] = arr[i];
  10.                 arr[i] = temp;
  11.             }
  12. }
  13. int main() {
  14.     int n;
  15.     printf("Enter array length:");
  16.     scanf("%d",&n);
  17.     int arr[n] ;
  18.     for(int i=0;i<n;i++)
  19.         scanf("%d",&arr[i]);
  20.     //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
  21.     selection_sort(arr, n);//呼叫函數由大而小排序
  22.     int i;
  23.     int r=1;//最大數的r值設定為1
  24.     for (i = 1; i < n; i++){//從第2大數開始拜訪
  25.         r++;//每拜訪一個,r就加1
  26.         if(arr[i]==arr[i-1])//如果該數重覆出現
  27.             r--;//r就不要加1
  28.         if(r==3){//如果r值是3
  29.            printf("The result is %d. ", arr[i]);//找到第3大數
  30.            break;//離開迴圈
  31.         }
  32.     }

  33.         if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
  34.            printf("The result is %d. ", arr[0]);//輸出最大數

  35.     return 0;
  36. }
複製代碼
不用排序法寫
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4.     int n,i,c,t,first,second,third;
  5.     printf("Enter array length:");
  6.     scanf("%d",&n);
  7.     int a[n];
  8.     for(i=0; i<n; i++){
  9.         scanf("%d",&a[i]);
  10.     }
  11.     first=second=third=0;
  12.     for(i=0; i<n; i++) //一個個數字拿出來看
  13.     {
  14.         c = a[i];   //放在c方便把被超越的數字往下比
  15.         if(c > first) //比最大的數大,就跟最大的數交換
  16.         {
  17.             t = first;
  18.             first = c;
  19.             c = t;
  20.         }
  21.         if(c == first) //重複的數就丟掉
  22.             c = 0;
  23.         if(c > second) //比第二大的數大,就跟第二大的數交換
  24.         {
  25.             t = second;
  26.             second = c;
  27.             c = t;
  28.         }
  29.         if(c == second) //重複的數就丟掉
  30.             c = 0;
  31.         if(c > third) //比第三大的數大,就跟第三大的數交換
  32.         {
  33.             t = third;
  34.             third = c;
  35.             c = t;
  36.         }
  37.     }
  38.     if(third > 0) //有第三大的數就印出第三大的數
  39.         printf("The result is %d.",third);
  40.     else         //沒有第三大的數就印出最大的數
  41.         printf("The result is %d.",first);

  42.     return 0;
  43. }
複製代碼
排序法應該還是比較慢,因為排序時,必須跑兩層迴圈。
排序的程式優點是可以用來解決複雜問題。
不排序的寫法只適用於簡單演算法的程式。太複雜就很難實作了。

作者: tonyh    時間: 2022-12-12 10:22

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.util.TreeSet;

  4. public class Ch01 {

  5.         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  6.         String raw[];
  7.         int n;
  8.         TreeSet<Integer> ts=new TreeSet<Integer>();

  9.         Ch01() throws Exception
  10.         {
  11.                 System.out.print("Enter array length: ");
  12.                 n=Integer.parseInt(br.readLine());
  13.                 raw=br.readLine().split(" ");
  14.                 for(int i=0; i<n; i++)
  15.                         ts.add(Integer.parseInt(raw[i]));
  16.                 System.out.print("The result is ");
  17.                 if(ts.size()<3)
  18.                         System.out.println(ts.last());
  19.                 else
  20.                 {
  21.                         int t=ts.floor(ts.last()-1);
  22.                         t=ts.floor(t-1);
  23.                         System.out.println(t);
  24.                 }
  25.         }

  26.         public static void main(String[] args) throws Exception{
  27.                 new Ch01();
  28.         }
  29. }
複製代碼

作者: tonyh    時間: 2022-12-12 12:42

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n, t;
  4. set<int> data;   //set容器的特性:不允許重複 & 遞增排序

  5. int main()
  6. {
  7.     cout<<"Enter array length: ";
  8.     cin>>n;
  9.     for(int i=0; i<n; i++)
  10.     {
  11.         cin>>t;
  12.         data.insert(t);
  13.     }

  14.     cout<<"The result is ";
  15.     if(data.size()<3)
  16.     {
  17.         //原始寫法為 set<int>::reverse_iterator it=data.rbegin();
  18.         //這裡以 auto 來自動判斷其型態
  19.         auto it=data.rbegin();  //抓取最後一個成員的位址
  20.         cout<<*it<<endl;   //取值
  21.     }
  22.     else
  23.     {
  24.         auto it=data.rbegin();
  25.         it++;   //逆向走訪的下一個
  26.         it++;
  27.         cout<<*it<<endl;
  28.     }
  29.     return 0;
  30. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2