logn_sort 2023-01-30 07:24 采纳率: 50%
浏览 84
已结题

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

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

7 14 3 8

样例输出

10

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

#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 << k * q - y;
    return 0;
}

  • 写回答

5条回答 默认 最新

  • 於黾 2023-01-30 07:32
    关注

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

    评论
  • 社区专家-Monster-XH 2023-01-30 07:48
    关注

    望采纳;
    根据你的代码和题目描述,题目要求你求出最少还需要做多少道题才能达到正确率为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;
    }
    
    
    评论
    logn_sort 2023-01-30 07:55

    bd,但我觉得好像没有关系,因为原来的k我就是用long long的,输出不需要转换。

    回复
    社区专家-Monster-XH 回复 logn_sort 2023-01-30 07:57

    那就是代码缩进、命名是否符合规范、数组越界,啥的

    回复
    logn_sort 回复 社区专家-Monster-XH 2023-01-30 08:01

    我是Wrong Answer捏(小声

    回复
  • 白首方悔读书迟 2023-01-30 08:02
    关注

    这段代码有以下问题:

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

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

    评论 编辑记录
  • 流比 2023-01-30 08:24
    关注

    代码错误可能在于计算正确率的方式,目前正确率计算是 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 可能不能给出正确的结果,请进一步检查。

    评论
  • X-道至简 2023-01-30 10:02
    关注

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

    #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;
    }
    
    评论
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月30日
  • 创建了问题 1月30日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部