PTA 乙级 1062 最简分数 (20分) C/C++
思路:输入两个分数的分子分母之后,为了之后方便进行比较,调整两分数的顺序为从小到大,分子从零开始进行累加到 k-1(i),判断通分后的分子(tmp)与分数1通分后的分子(cmp1),分数2通分后的分子(cmp2)进行比较,且保证将要输出的分子分母没有公约数(gcd)(更为方便理解的最大公约数的代码在1034 有理数的四则运算)
1 #include<iostream> 2 3 using namespace std; 4 5 int gcd(int a, int b) { //求最大公约数 6 return b == 0 ? a : gcd(b, a % b); 7 } 8 9 int main() { 10 long k = 0, n1 = 0, n2 = 0, m1 = 0, m2 = 0; 11 int flag = 0; 12 scanf("%d/%d %d/%d", &n1, &m1, &n2, &m2); 13 cin >> k; 14 if (n1 * m2 > n2 * m1) { //保证第一个分数小于第二个分数 15 swap(n1, n2); 16 swap(m1, m2); 17 } 18 for (int i = 0; i < k; ++i) { //分子从零开始累加 19 long tmp = i * m1 * m2; 20 long cmp1 = n1 * m2 * k; 21 long cmp2 = n2 * m1 * k; 22 if (tmp > cmp1 && tmp < cmp2 && gcd(i, k) == 1) { //通分后与分数1和分数2进行比较,且分子与分母没有公约数 23 if (flag) cout << ' '; 24 cout << i << '/' << k; 25 flag = 1; 26 } 27 } 28 return 0; 29 }
默默地一点点变强,细节决定成败