1. 程式人生 > >1088 三人行 (20 分)

1088 三人行 (20 分)

結果 小數 ping () 相關 tps 正整數 思路分析 void

子曰:“三人行,必有我師焉。擇其善者而從之,其不善者而改之。”

本題給定甲、乙、丙三個人的能力值關系為:甲的能力值確定是 2 位正整數;把甲的能力值的 2 個數字調換位置就是乙的能力值;甲乙兩人能力差是丙的能力值的 X 倍;乙的能力值是丙的 Y 倍。請你指出誰比你強應“從之”,誰比你弱應“改之”。

輸入格式:

輸入在一行中給出三個數,依次為:M(你自己的能力值)、X 和 Y。三個數字均為不超過 1000 的正整數。

輸出格式:

在一行中首先輸出甲的能力值,隨後依次輸出甲、乙、丙三人與你的關系:如果其比你強,輸出 Cong

;平等則輸出 Ping;比你弱則輸出 Gai。其間以 1 個空格分隔,行首尾不得有多余空格。

註意:如果解不唯一,則以甲的最大解為準進行判斷;如果解不存在,則輸出 No Solution

輸入樣例 1:

48 3 7

輸出樣例 1:

48 Ping Cong Gai

輸入樣例 2:

48 11 6

輸出樣例 2:

No Solution
(直接搬別人的啦,懶得打了)

二、思路分析
從題目中,知存在公式:
1、丙 * Y = 乙
2、丙 * X = | 甲 - 乙 |
應題目要求,令甲=99至10,判斷是否存在乙、丙符合要求。

三、錯誤分析
1、測試點4答案錯誤:
存在丙不為整數,符合要求。

2、修改過程中:
Bing =Yi / Y錯誤,因為丙會得到一個整數,而不是小數
應修改為
Bing = (double) Yi / (double) Y;
兩個int整數相除,若要正確賦值給一個double/float浮點型,必須在運算時使其中一個(或全部)int整數強制轉換為double/float浮點型。
如代碼if條件中的
abs(Yi - Jia) == Bing * X)
Bing為double浮點型,而 abs(Yi - Jia) 是整形
那麽 abs(Yi - Jia) / X == Bing 則可能得不到正確結果
應轉化為:
(double)abs(Yi - Jia) / (double)X
或轉化為乘法:
abs(Yi - Jia) == Bing * X(本題乘法兩端都應該得到整數結果,因此不會出錯)

代碼如下(寫的真爛。。還專門寫了個函數,最後把丙的相關式子都改成double了,還是18分,最後的最後才發現自定義函數沒改)

 1 #include<iostream>
 2 using namespace std;
 3 void cmp(double a,double b){
 4     if(a>b)cout<<"Cong";
 5     else if(a==b)cout<<"Ping";
 6     else cout<<"Gai";
 7 }
 8 int main(){
 9     int jia,yi,wo,x,y,flag=0;
10     cin>>wo>>x>>y;
11     for( jia=99;jia>=10;jia--){
12         yi=jia%10*10+jia/10;
13         double bing=abs(jia-yi)*1.0/x;
14         if(bing*y==yi){
15           cout<<jia<<" ";
16           cmp(jia,wo);
17           cout<<" ";
18           cmp(yi,wo);
19           cout<<" ";
20           cmp(bing,wo);
21           return 0;
22         }    
23     }
24     cout<<"No Solution";
25     return 0;
26 }

1088 三人行 (20 分)