藍橋杯_第五屆_奇怪的分式


【問題描述】

    上小學的時候,小明經常自己發明新算法。一次,老師出的題目是:

 

    1/4 乘以 8/5 

 

    小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (參見下圖)

 

    老師剛想批評他,轉念一想,這個答案湊巧也對啊,真是見鬼!

 

    對於分子、分母都是 1~9 中的一位數的情況,還有哪些算式可以這樣計算呢?

 

    請寫出所有不同算式的個數(包括題中舉例的)。

 

    顯然,交換分子分母后,例如:4/1 乘以 5/8 是滿足要求的,這算做不同的算式。

 

    但對於分子分母相同的情況,2/2 乘以 3/3 這樣的類型太多了,不在計數之列!

 

注意:答案是個整數(考慮對稱性,肯定是偶數)。請通過瀏覽器提交。

 

【問題分析】

窮舉算法:用4個變量來表示分子和分母,分式可表示為a/b×c/d=ac/bd,只要對a,b,c,d的所有情況進行窮舉,窮舉范圍1~9,窮舉過程中對分式是否成立進行判斷,成立計數器加1,最后輸出結果。窮舉過程中還有兩鍾情況需要注意,即a!=b,c!=d。

在計算分式時不能直接計算,因為分式的計算結果是浮點數,浮點數在比較是否相等時是不准確的,如0.1+0.2==0.3這個條件看起來是成立的,而實際結果為false。因此要化分數運算為整數運算,分式a/b×c/d=ac/bd要轉換為a×c×bd=b×d×ac。

 

【程序代碼】

 1 public class 藍橋杯_第五屆_奇怪的分式
 2 {
 3     public static void main(String[] args)
 4     {
 5         int count=0;
 6         for(int a=1;a<=9;a++)
 7         {
 8             for(int b=1;b<=9;b++)
 9             {
10                 if(a==b)
11                     continue;
12                 for(int c=1;c<=9;c++)
13                     for(int d=1;d<=9;d++)
14                     {
15                         if(c==d)
16                             continue;            
17                         if(a*c*Integer.parseInt(""+b+d)==b*d*Integer.parseInt(""+a+c))
18                         //錯誤的方法:if((1.0*a/b)*(1.0*c/d)==(1.0*Integer.parseInt(""+a+c)/Integer.parseInt(""+b+d)))
19                         {    
20                             count++;
21                             //System.out.printf("%d/%dx%d/%d=%d%d/%d%d\n",a,b,c,d,a,c,b,d);
22                         }                    
23                     }
24             }
25         }
26         System.out.println(count);
27     }
28 }

 

【運算結果】

14


免責聲明!

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



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