標題:
輸出整數陣列第三大數
[打印本頁]
作者:
may
時間:
2022-12-11 23:30
標題:
輸出整數陣列第三大數
用排序法寫
#include<stdio.h>
#include<stdlib.h>
void bubble_sort(int arr[], int len) {//自訂函數由大而小排序
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] < arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
int main() {
int n;
printf("Enter array length:");
scanf("%d",&n);
int arr[n] ;
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
//int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
bubble_sort(arr, n);//呼叫函數由大而小排序
int i;
int r=1;//最大數的r值設定為1
for (i = 1; i < n; i++){//從第2大數開始拜訪
r++;//每拜訪一個,r就加1
if(arr[i]==arr[i-1])//如果該數重覆出現
r--;//r就不要加1
if(r==3){//如果r值是3
printf("The result is %d. ", arr[i]);//找到第3大數
break;//離開迴圈,不必再找了
}
}
if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
printf("The result is %d. ", arr[0]);//輸出最大數
return 0;
}
複製代碼
排序的方法有很多,以下是用選擇排序法寫:
#include<stdio.h>
#include<stdlib.h>
void selection_sort(int arr[], int len) {//自訂函數由大而小排序
int i, j, temp;
for (i = 0; i < len - 1; i++)
for (j = i+1; j < len; j++)
if (arr[i] < arr[j ]) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
int main() {
int n;
printf("Enter array length:");
scanf("%d",&n);
int arr[n] ;
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
//int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
selection_sort(arr, n);//呼叫函數由大而小排序
int i;
int r=1;//最大數的r值設定為1
for (i = 1; i < n; i++){//從第2大數開始拜訪
r++;//每拜訪一個,r就加1
if(arr[i]==arr[i-1])//如果該數重覆出現
r--;//r就不要加1
if(r==3){//如果r值是3
printf("The result is %d. ", arr[i]);//找到第3大數
break;//離開迴圈
}
}
if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
printf("The result is %d. ", arr[0]);//輸出最大數
return 0;
}
複製代碼
不用排序法寫
#include <stdio.h>
#include <stdlib.h>
int main(){
int n,i,c,t,first,second,third;
printf("Enter array length:");
scanf("%d",&n);
int a[n];
for(i=0; i<n; i++){
scanf("%d",&a[i]);
}
first=second=third=0;
for(i=0; i<n; i++) //一個個數字拿出來看
{
c = a[i]; //放在c方便把被超越的數字往下比
if(c > first) //比最大的數大,就跟最大的數交換
{
t = first;
first = c;
c = t;
}
if(c == first) //重複的數就丟掉
c = 0;
if(c > second) //比第二大的數大,就跟第二大的數交換
{
t = second;
second = c;
c = t;
}
if(c == second) //重複的數就丟掉
c = 0;
if(c > third) //比第三大的數大,就跟第三大的數交換
{
t = third;
third = c;
c = t;
}
}
if(third > 0) //有第三大的數就印出第三大的數
printf("The result is %d.",third);
else //沒有第三大的數就印出最大的數
printf("The result is %d.",first);
return 0;
}
複製代碼
排序法應該還是比較慢,因為排序時,必須跑兩層迴圈。
排序的程式優點是可以用來解決複雜問題。
不排序的寫法只適用於簡單演算法的程式。太複雜就很難實作了。
作者:
tonyh
時間:
2022-12-12 10:22
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.TreeSet;
public class Ch01 {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String raw[];
int n;
TreeSet<Integer> ts=new TreeSet<Integer>();
Ch01() throws Exception
{
System.out.print("Enter array length: ");
n=Integer.parseInt(br.readLine());
raw=br.readLine().split(" ");
for(int i=0; i<n; i++)
ts.add(Integer.parseInt(raw[i]));
System.out.print("The result is ");
if(ts.size()<3)
System.out.println(ts.last());
else
{
int t=ts.floor(ts.last()-1);
t=ts.floor(t-1);
System.out.println(t);
}
}
public static void main(String[] args) throws Exception{
new Ch01();
}
}
複製代碼
作者:
tonyh
時間:
2022-12-12 12:42
#include<bits/stdc++.h>
using namespace std;
int n, t;
set<int> data; //set容器的特性:不允許重複 & 遞增排序
int main()
{
cout<<"Enter array length: ";
cin>>n;
for(int i=0; i<n; i++)
{
cin>>t;
data.insert(t);
}
cout<<"The result is ";
if(data.size()<3)
{
//原始寫法為 set<int>::reverse_iterator it=data.rbegin();
//這裡以 auto 來自動判斷其型態
auto it=data.rbegin(); //抓取最後一個成員的位址
cout<<*it<<endl; //取值
}
else
{
auto it=data.rbegin();
it++; //逆向走訪的下一個
it++;
cout<<*it<<endl;
}
return 0;
}
複製代碼
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/)
Powered by Discuz! 7.2