关于#AC正确率#的问题,如何解决?

题目描述
做到这里,你已经具有一定的编程经验了,假设你做了y道题,其中有x道题通过,那么正确率为x/y
假设你想要自己的正确率达到p/q,你最少还需要做多少个题?
p/q是最简分数形式
输入格式
输入四个整数x,y,p,q
输出格式
输出一个整数,如果不可能达到p/q,输出-1
样例输入

7 14 3 8

样例输出

10

本题我的代码WA85分,请问哪里错了?

#include 
using namespace std;
int main() {
    int x, y, p, q;
    scanf("%d%d%d%d", &x, &y, &p, &q);
    double a = x * 1.0 / y, b = p * 1.0 / q;
    if (b == 0 || b == 1) {
        puts("-1");
        return 0;
    }
    long long k = max((x - 1) / p, (y - x - 1) / (q - p)) + 1;
    cout << k * q - y;
    return 0;
}

肯定是先约分,把分母统一了之后,分子相减,就是你需要做的题目
分数题你用小数做那误差大了

望采纳;
根据你的代码和题目描述,题目要求你求出最少还需要做多少道题才能达到正确率为p/q。你代码实现了题目要求,不过可能存在精度问题,导致WA 85分。建议使用long long存储中间结果,避免精度问题。
可以在算出k后将它强制转化为long long类型。代码如下:

c

#include <bits/stdc++.h>
using namespace std;
int main() {
    int x, y, p, q;
    scanf("%d%d%d%d", &x, &y, &p, &q);
    double a = x * 1.0 / y, b = p * 1.0 / q;
    if (b == 0 || b == 1) {
        puts("-1");
        return 0;
    }
    long long k = max((x - 1) / p, (y - x - 1) / (q - p)) + 1;
    cout << (long long)(k * q - y);
    return 0;
}

这段代码有以下问题:

没有处理分母为0的情况
没有处理分子为0的情况
可能存在计算精度问题
解决方案:

在算b时加上判断q是否为0,如果是,输出-1
在算k时加上判断p是否为0,如果是,把k赋为0
使用double改为使用long long计算

代码错误可能在于计算正确率的方式,目前正确率计算是 a = x * 1.0 / y, b = p * 1.0 / q,而正确率应该是 a = x / y, b = p / q。
另外,代码中的 k = max((x - 1) / p, (y - x - 1) / (q - p)) + 1 可能不能给出正确的结果,请进一步检查。

估计有些条件没有判断,这样试试
改动的加了 ==== 标识

#include <bits/stdc++.h>
using namespace std;
int main() {
    int x, y, p, q;
    scanf("%d%d%d%d", &x, &y, &p, &q);
    if (x<0||y<=0||p<0||q<=0||x>y||p>q) { //====
        puts("-1"); //====
        return 0; //====
    } //====
    double a = x * 1.0 / y, b = p * 1.0 / q;
    if (b == 0 || b == 1) {
        puts("-1");
        return 0;
    }
    long long k = max((x - 1) / p, (y - x - 1) / (q - p)) + 1;
    cout << k * q - y;
    return 0;
}