2016年藍橋杯B組C/C++省賽(預選賽)題目解析


2016年藍橋杯B組C/C++

點擊查看2016年藍橋杯B組省賽試題(無答案版)

![](https://img2018.cnblogs.com/blog/1454456/201811/1454456-20181125135015550-30277785.png)

第一題:煤球數目 題解

有一堆煤球,堆成三角棱錐形。具體:
第一層放1個,
第二層3個(排列成三角形),
第三層6個(排列成三角形),
第四層10個(排列成三角形),
....
如果一共有100層,共有多少個煤球?

請填表示煤球總數目的數字。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

題解:171700 數列求和

        int acc=0,num=0; 
        for(int i=1;i<=100;i++){
            acc += i; 
            num += acc; 
        }
        cout<<num<<endl;

第二題:生日蠟燭

某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。

現在算起來,他一共吹熄了236根蠟燭。

請問,他從多少歲開始過生日party的?

請填寫他開始過生日party的年齡數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

題解:26 枚舉,等差數列求和

#include<iostream>
using namespace std;

int main(){
	int n;
	int sum = 1;

	//枚舉 開始過生日得年齡j 過了幾次i 
	for(int i=1;i<=111;i++){
		for(int j=1;j<=111;j++){
			//等差數列求和 a1 = i*j(開始過生日那年歲數,也就是吹蠟燭得數量,公差d=1,和等於236) 
			if(i*j+1.5*(i*i) - 1.5*i == 236){
				cout<<"i="<<i<<" "<<" j="<<j<<endl;
			}
		}
	}
	int d = 26;
	for(int i=1;i<=11;i++){
		sum+=d;
		cout<<sum<<endl;
		d++;
	}
}
//26歲過的生日 

第三題:湊算式

     B      DEF
A + --- + ------- = 10
     C      GHI

(如果顯示有問題,可以參見【圖1.jpg】)

這個算式中AI代表19的數字,不同的字母代表不同的數字。

比如:
6+8/3+952/714 就是一種解法,
5+3/1+972/486 是另一種解法。

這個算式一共有多少種解法?

注意:你提交應該是個整數,不要填寫任何多余的內容或說明性文字。

題解一:29 暴力枚舉

#include<iostream>
using namespace std;

int main(){
	int sum = 0;
	//解法一:暴力枚舉 枚舉每一個位置的值 
	for(int a = 1;a<=9;a++){
		for(int b = 1;b<=9;b++){
			if(b==a) continue;
		for(int c = 1;c<=9;c++){
			if(c==b || c==a) continue;
		for(int d = 1;d<=9;d++){
			if(d==c || d==b || d==a) continue;
		for(int e = 1;e<=9;e++){
			if(e==d || e==c || e==b || e==a) continue;
		for(int f = 1;f<=9;f++){
			if(f==d || f==c || f==b || f==a ||f==e) continue;
		for(int g = 1;g<=9;g++){
			if(g==d || g==c || g==b || g==a ||g==e||g==f) continue;
		for(int h = 1;h<=9;h++){
			if(h==d || h==c || h==b || h==a ||h==e||h==f || h==g) continue;
		for(int i = 1;i<=9;i++){
			if(i==d || i==c || i==b || i==a ||i==e||i==f || i==g || i==h) continue;
			int ghi = g*100+h*10+i;
			int def = d*100+e*10+f;
			//解決除法精度問題 需要將除數乘以0.1 
			if( a+b*1.0/c+def*1.0/ghi==10 ){
				sum++;
				cout<<"a= "<<a<<"  "<<"b= "<<b<<"  "<<"c= "<<c<<"  def="<<def<<"  ghi="<<ghi<<endl;
			}
		}
		}
		}
		}
		}
		}
		}
		}
		}
		cout<<sum<<endl;
} 
//29種 

題解二:29 dfs深搜:dfs全排列類型題

#include<iostream>
using namespace std;

//dfs:9個數做全排列 不使用相同數字 

int a[9]={0};
int ans=0;
bool judge(int *a)//判斷是否算式和為10
{
    double x=a[0]+a[1]*1.0/a[2]+(a[3]*100+a[4]*10+a[5])*1.0/(a[6]*100+a[7]*10+a[8]);
    if(x==10.0) return true;
    return false;
}

bool check(int index)//檢測a[index]是否有重復
{
	//檢查前index-1個數是否與當前數重復 
    for(int i=index-1;i>=0;i--)
    {
        if(a[i]==a[index]) return false;
    }
    return true;
}

//就是最基本的9個數全排列,在dfs結束條件里用judge()做判斷
void dfs(int index)
{
	//結束條件中調用judge()判斷是否滿足條件 
    if(index>8)
    {
        if(judge(a))
        ans++;
        return;
    }
    
    //枚舉1~9這10個數 
    for(int i=1;i<=9;i++)
    {
        a[index]=i;//當前位置的值置為i 
        //check()函數判斷當前位置是否用了 前面用過的重復的數字 
        if(check(index))
        { 
            dfs(index+1);//沒有重復,則枚舉下一個位置的數 
        }
    }
}

int main()
{
    dfs(0);
    cout<<ans<<endl;
    return 0;
}

第四題:快速排序

排序在各種場合經常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先選一個“標尺”,
用它把整個隊列過一遍篩子,
以保證:其左邊的元素都不大於它,其右邊的元素都不小於它。

這樣,排序問題就被分割為兩個子區間。
再分別對子區間排序就可以了。

下面的代碼是一種實現,請分析並填寫划線部分缺少的代碼。

題解:swap(a,j,p);

選定第一個表示a[p]p=0,即第一個元素,i從數組前面向后移,j從數組后面向前移動。i停在比a[p]大的位置,j停在比a[p]小的位置,交換他倆的位置,到i>=j的時候停止移動,這時候,p位置到j位置是小於a[p]的元素,j+1位置到r位置都是大於a[p]的元素,該段代碼的目的是標尺的左邊都是小於它的數,右邊都是大於它的數,所以要將p位置的元素和j位置的元素進行交換。

考察調試程序BUG的能力,步驟如下:

①理解題干,從題干中找出發點,寫出正確的程序結果

②對照程序輸出結果進行邏輯推測

③觀察程序代碼找出漏洞

#include <stdio.h>

void swap(int a[], int i, int j)
{
	int t = a[i];
	a[i] = a[j];
	a[j] = t;
}

//快速排序 嚴版數據結構中的做法  以第一個元素為樞軸 兩邊排 
int partition(int a[], int p, int r)
{
	int i = p;
	int j = r + 1;
	int x = a[p];//以第一個元素為樞軸
	while(1){
		while(i<r && a[++i]<x);
		while(a[--j]>x);
		if(i>=j) break;
		swap(a,i,j);
	}
	swap(a,j,p);//樞軸元素存放到最終位置j上 
	return j;
}

void quicksort(int a[], int p, int r)
{
	if(p<r){
		int q = partition(a,p,r);
		quicksort(a,p,q-1);
		quicksort(a,q+1,r);
	}
}

int main()
{
	int i;
	int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
	int N = 12;
	quicksort(a, 1, N-1);
	for(i=1; i<N; i++) printf("%d ", a[i]);
	printf("\n");
	return 1;
}

第五題:抽簽

X星球要派出一個5人組成的觀察團前往W星。
其中:
A國最多可以派出4人。
B國最多可以派出2人。
C國最多可以派出2人。
....

那么最終派往W星的觀察團會有多少種國別的不同組合呢?

下面的程序解決了這個問題。
數組a[] 中既是每個國家可以派出的最多的名額。
程序執行結果為:

DEFFF
CEFFF
CDFFF
CDEFF
CCFFF
CCEFF
CCDFF
CCDEF
BEFFF
BDFFF
BDEFF
BCFFF
BCEFF
BCDFF
BCDEF
....
(以下省略,總共101行)

題解:f(a,k+1,m-j,b);

1.讀題后看程序,不難看出填空位置是要填寫遞歸語句,
2.而第一個參數和最后一個參數不需要改變,
根據遞歸退出條件和給出的常量可以推斷出m表示還需要組多少人。k表示隊伍編,因此每次操作一個隊伍,
所以每次遞歸的時候k要加一,而m需要減少當前已經選的人數。

#include <stdio.h>
#include<iostream>
#define N 6
#define M 5
#define BUF 1124
using namespace std;

void f(int a[], int k, int m, char b[])
{
	int i,j;
	//到達最后一個國家時 要是名額已滿 打印b 
	if(k==N){
		b[M] = 0;
		if(m==0) printf("%s\n",b);
		return;
	}

	//a[k]表示當前第k國所人數總數 
	for(i=0; i<=a[k]; i++){
		//第k國所有人都作為參加人員 
		for(j=0; j<i; j++){
//			int d = M-m+j; //調試理解M-m+j 
//			if(k==0)cout<<d<<endl;
			//理解M-m+j
			b[M-m+j] = k+'A';  //
		}
//		cout<<b<<endl;//調試打印字符數組b 
		f(a,k+1,m-i,b);//m-j還剩幾個人。剩下幾人呢? 當前選了第i個人 i++,所以還剩下m-i個人,比如i=0 i++ 還剩下 5-1個 
	}
}

int main()
{
	int a[N] = {4,2,2,1,1,3};//各國人數
	char b[BUF];//存放結果 
	f(a,0,M,b);//調用函數 
	return 0;
}

第六題:方格填數

如下的10個格子

   +--+--+--+
   |  |  |  |
+--+--+--+--+
|  |  |  |  |
+--+--+--+--+
|  |  |  |
+--+--+--+

(如果顯示有問題,也可以參看【圖1.jpg】)

填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)

一共有多少種可能的填數方案?

請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

題解:1580 dfs回溯

從坐標(0,1)開始dfs枚舉填數,且不能使用相同數字(v數組作標記是否使用),相鄰格子數字也不能相鄰(使用isvalid()函數做判斷),當前狀態搜索完后,回溯恢復原狀態(使用過的數置為未使用)

#include<iostream>
#include<algorithm>
using namespace std;

int mymap[3][4] = {{-222,-4,-6,-8},{-10,-12,-14,-16},{-18,-20,-22,-2222}};
int ans = 0;
int v[10]; //判斷數是否用過 


//檢測 上 下 左 右 左上 右上 左下 右下 共8個方向的值與當前坐標上的值是否相鄰
bool isvalid(int x,int y,int k){
	bool flag = true;
	if(x-1>=0 && abs(mymap[x-1][y] - k) == 1){
		flag = false;
	}
	if(x+1<=2 && abs(mymap[x+1][y] - k) == 1){
		flag = false;
	}
	if(y-1>=0 && abs(mymap[x][y-1] - k) == 1){
		flag = false;
	}
	if(y+1<=3 && abs(mymap[x][y+1] - k) == 1){
		flag = false;
	}
	if(x-1>=0 && y-1>=0 && abs(mymap[x-1][y-1] - k) == 1){
		flag = false;
	}
	if(x-1>=0 && y+1<=3 && abs(mymap[x-1][y+1] - k) == 1){
		flag = false;
	}

	if(x+1<=2 && y+1<=3 && abs(mymap[x+1][y+1] - k) == 1){
		flag = false;
	}
	if(x+1<=2 && y-1>=0 && abs(mymap[x+1][y-1] - k) == 1){
		flag = false;
	}
	return flag;
}

void dfs(int x,int y){
	
	if(x==2 && y==3){
		ans++;
		return;
	}
	
	//下一步dfs的坐標 
	int nextx = x; 
	int nexty = y+1;

	for(int k=0;k<=9;k++){
		if( !v[k] && isvalid(x,y,k) ){
			mymap[x][y] = k;
			v[k] = 1;//當前數已經用過 
			
			//坐標換行 
			if(y==3 && x<2){
				 nextx = x+1;
				 nexty = 0;
			}
			
			dfs(nextx,nexty);
			v[k] = 0;//什么時候要回溯?——后面不同坐標dfs的條件中要用到當前v數組的值 和 mymap的值 
			mymap[x][y] = -2;
		}
	}


}

void init(){
	for(int i=0;i<=2;i++){
		for(int j=0;j<=3;j++){
			mymap[i][j] = -2;
		}
	}
	for(int i=0;i<=9;i++){
		v[i] = 0;
	}		
} 

int main(){
	dfs(0,1); 
	cout<<ans<<endl;
}
//1580

第七題:剪郵票

如【圖1.jpg】,

有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連着的。
(僅僅連接一個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。

請你計算,一共有多少種不同的剪取方法。

請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。

題解:116 暴力枚舉選出5個數 + dfs判斷連通性

#include<iostream>
using namespace std;

//暴力枚舉選出5個數 dfs判斷是否連通

int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//題目中的郵票矩陣 
bool visited[13] = {false};//判斷數是否訪問過 
bool selected[13] = {false};//判斷數是否選中 
int ans = 0;//統計總數 
int dr[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//方向數組 

//檢查dfs后當前選的5個值是否滿足條件 
bool check(int a,int b,int c,int d,int e){
	if(visited[a] == false){
		return false;
	}
	if(visited[b] == false){
		return false;
	}
	if(visited[c] == false){
		return false;
	}
	if(visited[d] == false){
		return false;
	}
	if(visited[e] == false){
		return false;
	}
	return true;
}

//判斷當前所選的5個數的連通性
void dfs(int a){
	
	//找到數值為a時 在郵票矩陣中對應的坐標 
	int x,y;
	for(int i=0;i<3;i++){
		for(int j=0;j<4;j++){
			if(arr[i][j] == a){
				x = i;
				y = j;
				break;
			}
		}
	}
	
 	//開始枚舉四個方向搜索 判斷連通性
	int nextx,nexty;
	for(int i=0;i<4;i++){
		nextx = x + dr[i][0];
		nexty = y + dr[i][1];
		//越界判斷 這種情況要跳過 
		if( nextx >2 || nexty>3 || nextx<0 || nexty<0 ){
			continue;
		}
		int d = arr[nextx][nexty];//下一個遍歷的點 
	
		if( !visited[d] && selected[d]){
			visited[d] = true;//下一個遍歷的點設置成訪問過 
			dfs(d);//遍歷下一個點  
		}
	}	
}

int main(){
	//畢竟只是填空題 數據量也小 暴力一下 
	//這里遞增枚舉 避免重復 
	for(int a = 1;a<=8;a++){
		for(int b = a+1;b<=9;b++){
			for(int c = b+1;c<=10;c++){
				for(int d=c+1;d<=11;d++){
					for(int e=d+1;e<=12;e++){
						
						//清空visited數組 
						for(int i=1;i<=12;i++){
							visited[i] = false;
						}

						//selected數組置為已經選擇 
						selected[a] = true;
						selected[b] = true;
						selected[c] = true;
						selected[d] = true;
						selected[e] = true;
						
						visited[a] = true;//dfs搜索的起點設置成訪問過						
						dfs(a);//開始搜索起點 
						
						//dfs搜完后清空selected數組 
						selected[a] = false;
						selected[b] = false;
						selected[c] = false;
						selected[d] = false;
						selected[e] = false;
						
						//檢查是否滿足連通:遍歷visited數組 連通的條件是visited數組的5個數在dfs搜索的時候全部訪問過 
						bool flag = false;
						flag = check(a,b,c,d,e);
						if(flag){
							ans++;
							cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<endl;
						}				
					}
				}
				
			}
		} 
	}
	cout<<ans<<endl;
	return 0;
}

第八題:四平方和

四平方和定理,又稱為拉格朗日定理:
每個正整數都可以表示為至多4個正整數的平方和。
如果把0包括進去,就正好可以表示為4個數的平方和。

比如:

5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符號表示乘方的意思)

對於一個給定的正整數,可能存在多種平方和的表示法。
要求你對4個數排序:
0 <= a <= b <= c <= d
並對所有的可能表示法按 a,b,c,d 為聯合主鍵升序排列,最后輸出第一個表示法

程序輸入為一個正整數N (N<5000000)
要求輸出4個非負整數,按從小到大排序,中間用空格分開

例如,輸入:
5
則程序應該輸出:
0 0 1 2

再例如,輸入:
12
則程序應該輸出:
0 2 2 2

再例如,輸入:
773535
則程序應該輸出:
1 1 267 838

資源約定:
峰值內存消耗 < 256M
CPU消耗 < 3000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。

注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標准,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include , 不能通過工程設置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

題解:法一暴力枚舉,法二枚舉+查表

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int main(){
	int t;
	cin>>t;
	//暴力枚舉 4層循環 
	for(int a=0;a*a<t;a++){
		for(int b=a;b*b<t;b++){
			for(int c=b;c*c<t;c++){
				for(int d=c;d*d<t;d++){
					if(a*a + b*b + c*c + d*d == t){
						printf("%d %d %d %d\n",a,b,c,d);
						return 0; 
					}
				}
			}
		}
	}
	return 0;
} 
//枚舉,后面再優化 

方法二:unordered_map查表

#include<iostream>
#include<unordered_map> 
#include<algorithm>
#include<cstdio>
using namespace std;

unordered_map<int,int> mymap;

int main(){
//	枚舉a*a + b*b   查表查找是否有c*c + d*d 滿足 n-a*a-b*b == c*c + d*d 
	long long  n;
	cin>>n;
	long long a,b,c,d,e;
	//生成表 
	for(c = 0;c*c<=n;c++){
		for(d=c;c*c+d*d<=n;d++){
			if(mymap.find(c*c+d*d) == mymap.end()){
				mymap[c*c+d*d] = c;//存放c的值  c*c-d*d:c 
			}
		}
	}
	//枚舉a和b 
	for(a = 0;a*a*4<=n;a++){
		for(b=a;b*b*2<=n;b++){
			//查找表 查看mymap表中是否有 n-a*a-b*b這個值 
			if(mymap.find(n-a*a-b*b) != mymap.end()){
				c = mymap[n-a*a-b*b];
				d = int(sqrt(n-a*a-b*b-c*c));
				cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
				return 0;
			}
		}
	} 
	return 0;
} 

第九題:交換瓶子

有N個瓶子,編號 1 ~ N,放在架子上。

比如有5個瓶子:
2 1 3 5 4

要求每次拿起2個瓶子,交換它們的位置。
經過若干次后,使得瓶子的序號為:
1 2 3 4 5

對於這么簡單的情況,顯然,至少需要交換2次就可以復位。

如果瓶子更多呢?你可以通過編程來解決。

輸入格式為兩行:
第一行: 一個正整數N(N<10000), 表示瓶子的數目
第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。

輸出數據為一行一個正整數,表示至少交換多少次,才能完成排序。

例如,輸入:
5
3 1 2 5 4

程序應該輸出:
3

再例如,輸入:
5
5 4 3 2 1

程序應該輸出:
2

資源約定:
峰值內存消耗 < 256M
CPU消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。

注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標准,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include , 不能通過工程設置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

題解:模擬法,有點像冒泡排序

n-1層循環 比較當前第i個 與 [i+1,n]即i后面的數,找到一個比當前i值小的最小的元素,記錄下標交換位置

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int a[10010];
int ans = 0;

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	//n-1層循環 找到比當前元素小的最小的一個數的下標 交換位置 
	for(int i=1;i<n;i++){
		int d = a[i];
		int min = 0x3f3f3f3f;
		int minindex = -1;
		
		//從i+1開始找 找到比當前元素小的最小的一個數的下標
		for(int j=i+1;j<=n;j++){
			if(a[j] < a[i] && a[j]<min){
				min = a[j];
				minindex = j;
			}
		}
		//交換位置  
		if(a[i] != a[minindex] && minindex!=-1){
			ans++;
			swap(a[i],a[minindex]);
		}
	}
	cout<<ans<<endl;
	return 0;
} 

第十題:最大比例

X星球的某個大獎賽設了M級獎勵。每個級別的獎金是一個正整數。
並且,相鄰的兩個級別間的比例是個固定值。
也就是說:所有級別的獎金數構成了一個等比數列。比如:
16,24,36,54
其等比值為:3/2

現在,我們隨機調查了一些獲獎者的獎金數。
請你據此推算可能的最大的等比值。

輸入格式:
第一行為數字N,表示接下的一行包含N個正整數
第二行N個正整數Xi(Xi<1 000 000 000 000),用空格分開。每個整數表示調查到的某人的獎金數額

要求輸出:
一個形如A/B的分數,要求A、B互質。表示可能的最大比例系數

測試數據保證了輸入格式正確,並且最大比例是存在的。

例如,輸入:
3
1250 200 32

程序應該輸出:
25/4

再例如,輸入:
4
3125 32 32 200

程序應該輸出:
5/2

再例如,輸入:
3
549755813888 524288 2

程序應該輸出:
4/1

資源約定:
峰值內存消耗 < 256M
CPU消耗 < 3000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。

所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。

注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標准,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include , 不能通過工程設置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

題解:通過本題學會使用gcd求最大公約數,化簡分數,分數比較大小。

#include<iostream>
#include<algorithm> 
using namespace std;

//復雜度o(n^2) 能過100%的數據 
//思路: 分析序列的比例關系——借用gcd最大公約數化簡分數,比較分數時分母通分后比較分子, 
//借用多個數組存放數據

bool cmp(long long a,long long b){
	return a>b;
}

long long arr[10010];
long long p1[10010],p2[10010];
long long n;

long long gcd(long long a,long long b){
    if(b==0){
        return a;
    }
    return gcd(b,a%b);
} 

int main(){
	cin>>n;
	for(long long i=0;i<n;i++){
		cin>>arr[i];
	}
	sort(arr,arr+n,cmp);
	//54 36 16
	//3/2 9/4  
	 
	//存放比例( 數/最大公約數 ) 
	for(long long i=0;i<n-1;i++){
		long long d = gcd(arr[i],arr[i+1]);
		p1[i] = arr[i]/d; 
		p2[i] = arr[i+1]/d; 
		//p[i]/p[i+1]就是相鄰元素間的比例 共n-1個下標n-2 
	}
	
	long long num1,num2,temp = 0x3f3f3f3f,final1,final2;
	//遍歷兩個數組
	for(long long i=0;i<n-2;i++){
		for(long long j=i+1;j<n-1;j++){
			//通分 比如3/2 9/4  通分成 12/8和18/8 
			if(p1[i] * p2[j] == p1[j] * p2[i]){
				//兩個相等時 p1 == p2 
				num1 = p1[i];
				num2 = p2[i];
			}

            if(p1[i]*p2[j]>p1[j]*p2[i]){   
                num1=p1[i]/p1[j];
                num2=p2[i]/p2[j];
            }
            else if(p1[i]*p2[j]<p1[j]*p2[i]){
                num1=p1[j]/p1[i];
                num2=p2[j]/p2[i];
			}
			if(num1*1.0/num2 < temp){
				temp  = num1*1.0/num2;
				final1 = num1;
				final2 = num2;
			}
		}
	}
	cout<<final1<<"/"<<final2<<endl;
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM