PAT-乙级-1062 最简分数
生活随笔
收集整理的這篇文章主要介紹了
PAT-乙级-1062 最简分数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個分數一般寫成兩個整數相除的形式:N/M,其中?M?不為0。
最簡分數是指分子和分母沒有公約數的分數表示形式。
現給定兩個不相等的正分數N?1??/M?1???和?N?2??/M?2??,要求你按從小到大的順序列出它們之間分母為?K?的最簡分數。
輸入格式:
輸入在一行中按N/M的格式給出兩個正分數,隨后是一個正整數分母?K,其間以空格分隔。
題目保證給出的所有整數都不超過 1000。
輸出格式:
在一行中按?/?的格式列出兩個給定分數之間分母為?K?的所有最簡分數,按從小到大的順序,其間以 1 個空格分隔。
行首尾不得有多余空格。
題目保證至少有 1 個輸出。
輸入樣例:
7/18 13/20 12輸出樣例:
5/12 7/12分析:
計算給定兩個分數的值
在兩個值之間遍歷分母為k的所有可能情況
將該數通分后判斷分母是否為k
將所有結果輸出即可
PS:
一定要通分
輸入的兩個分數要保證左大右小
1 //c++ 2 3 #include<iostream> 4 using namespace std; 5 6 //將分數轉換為double 7 double func(char *s){ 8 int a=0,b=0,i=0; 9 for(;s[i]!='/';i++) 10 a=a*10+s[i]-'0'; 11 for(i++;s[i]!='\0';i++) 12 b=b*10+s[i]-'0'; 13 return 1.0*a/b; 14 } 15 16 //計算最大公約數gcd 17 int gcd(int a,int b){ 18 int m; 19 if(a<b){ 20 m=a; 21 a=b; 22 b=m; 23 } 24 while(b){ 25 m=a%b; 26 a=b; 27 b=m; 28 } 29 return a; 30 } 31 32 int main(){ 33 char a[10],b[10]; 34 double da,db; 35 int k,g,p,q,f=0; 36 cin>>a>>b>>k; 37 da=func(a); 38 db=func(b); 39 if(da>db){ 40 double t=da; 41 da=db; 42 db=t; 43 } 44 for(int i=1;i<=k*1000;i++){ 45 double v=1.0*i/k; 46 if(da<v&&v<db){ 47 g=gcd(i,k); 48 p=i/g; 49 q=k/g; 50 if(q==k){ 51 if(f){ 52 cout<<' '; 53 } 54 cout<<p<<'/'<<q; 55 f=1; 56 } 57 } 58 } 59 return 0; 60 }
?
轉載于:https://www.cnblogs.com/tenjl-exv/p/10080172.html
總結
以上是生活随笔為你收集整理的PAT-乙级-1062 最简分数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 底层系统如何实现数据一致性/系统底层如何
- 下一篇: mysql共享锁