PAT-乙-1062 1062 最簡分數 (20 分)
阿新 • • 發佈:2018-11-03
程式碼
#include <iostream> #include <algorithm> using namespace std; int maxCommon(int a, int b) { if(a>b) { swap(a, b); } while(b%a) { int t = b%a; b = a; a = t; } return a; } int main() { int n1, m1, n2, m2; int c; scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &c); double d1 = (double)n1/m1; double d2 = (double)n2/m2; if(d1>d2) { swap(d1, d2); } bool flag = true; for(int i=0; i<(int)(d2*c)+1; i++) { double t = (double)i/c; if(t-d1>1e-8 && d2-t>1e-8) { { if(flag && maxCommon(i, c)==1) { printf("%d/%d", i, c); flag = false; } else if(maxCommon(i , c)==1) { printf(" %d/%d", i, c); } } } } printf("\n"); return 0; }
註解
1、if(t-d1>1e-8 && d2-t>1e-8)
**此句是關鍵,實數的比較不要直接用大於、小於,而要用相減,與1e-8相比的形式。**否則會有一個案例錯誤。這與實數在計算機中的儲存方式有關。具體聯絡《計算機組成原理》課程。
2、swap(d1, d2)函式,用於交換d1和d2,包含在algorithm演算法中。可直接呼叫。
3、maxCommon求最大公約數,用輾轉相除法。