1062. 最简分数(20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
一个分数一般写成两个整数相除的形式:N/M,其中M不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N1/M1 和 N2/M2,要求你按从小到大的顺序列出它们之间分母为K的最简分数。
输入格式:
输入在一行中按N/M的格式给出两个正分数,随后是一个正整数分母K,其间以空格分隔。题目保证给出的所有整数都不超过1000。
输出格式:
在一行中按N/M的格式列出两个给定分数之间分母为K的所有最简分数,按从小到大的顺序,其间以1个空格分隔。行首尾不得有多余空格。题目保证至少有1个输出。
输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
看起来题目很简单,快速敲完以为可以一次性AC,结果错倆???懵逼,后面发现输入的两个分数大小是不确定的,可能要进行交换。再试,测试点3还是过不去,怀疑是自己写的检查是否为最简分数的函数错了,换成了网上通用的gcd()测试最大公约数,结果测试点3还是错的!网上到处看帖子也没找到问题,结果灵光一闪,把 double s1 = (double)n1 / (double)m1 * (double)k;换成了double s1 = (double)n1 * (double)k / (double)m1;,就是把先除后乘,换成了先乘后除,结果特么的就过了!!!你妹啊!摔!
呵呵呵,想来就是浮点数运算的问题,平时不注意这些坑,这下就翻车了
#include <iostream>
#include <vector>
using namespace std;
int gcd(int a, int b)
{
if (b == 0) return a;
a %= b;
return gcd(b, a);
}
int main(){
int gcd(int, int);
int n1, m1, n2, m2, k;
scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
double s1 = (double)n1 * (double)k / (double)m1;
double s2 = (double)n2 * (double)k / (double)m2;
if (s1 > s2){
double temp;
temp = s2;
s2 = s1;
s1 = temp;
}
vector<int> p;
for (int i = (int)s1 + 1; i < s2; ++i){
if (gcd(i, k) == 1)
p.push_back(i);
}
for (unsigned i = 0; i < p.size(); ++i){
cout << p[i] << '/' << k;
if (i != p.size() - 1)
cout << ' ';
}
return 0;
}