算法题上交后显示部分正确,找不出哪里错误

这个是题目

img

有部分测试例子结果是正确的,有一个运行超时,一个答案错误,求帮助

↓↓以下是出问题的代码↓↓

#include<stdio.h>
#include<math.h>
int main(){ 
    int N;
    char ch[100];
    long long a[100],b[100],i;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%lld",&a[i]);
        scanf("%c",&ch[i]);
        scanf("%lld",&b[i]);
    }
    long long n=labs(b[0]);
    int m;
    while(1){
        m=0;
        for(i=0;i<N;i++)
        {
            if(n%b[i]!=0){
                m=1;
                break;
            }
        }
        if(m==0) break;
        n++;
    }
    for(i=0;i<N;i++)
    {
        a[i]*=(n/b[i]);
        b[i]*=(n/b[i]);
    }
    long long suma=0,sumb=b[0];
    for(i=0;i<N;i++){
        suma+=a[i];
    }
    long long k,max=(suma>=sumb)?suma:sumb;
    for(i=max;i>0;i--){
        if(suma%i==0&&sumb%i==0){
            k=i;
            break;
        }
    }
    int j=0;
    if(labs(suma)<labs(sumb)){
        suma/=k;
        sumb/=k;
        printf("%lld/%lld\n",suma,sumb);    
    }
    else if(suma%sumb==0&&labs(suma)>=labs(sumb)) printf("%d\n",suma/sumb);
    else{
        suma/=k;
        sumb/=k;
        for(i=0;i<n;i++){
            if(suma<sumb){
                printf("%d %lld/%lld\n",j,suma,sumb);
                break;
            }
            suma-=sumb;
            j++;
        }
    }
    return 0;
}

有几个问题:
(1)while(1)这里,你应该是想求所有分母的公倍数,但是如果输入的数字相差比较大的话,很耗时
(2)第28行的for循环里,没必要对所有的b[i]相乘,只对b[0]处理即可了,这里也是一个耗时(虽然影响不大)
(3)题目要求如果是负数,负号在分子列,但是你的输出里没有这个处理
修改后运行结果:

img

代码修改如下:

#include<stdio.h>
#include<math.h>

//添加一个求公约数的函数
long long gys(long long a, long long b)
{
    long long t,c;
    if (a < b)
    {
        t = a;
        a = b;
        b = t;
    }
    c = a % b;
    while (c != 0)
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}



int main() {
    int N;
    char ch[100];
    long long a[100], b[100], i;
    long long maxnmb; //修改1,记录所有分母的最大值
    scanf("%d", &N);
    for (i = 0; i < N; i++)
    {
        scanf("%lld", &a[i]);
        scanf("%c", &ch[i]);
        scanf("%lld", &b[i]);
        //修改2  记录最大值
        if (i == 0)
            maxnmb = b[0];
        else if (b[i] > maxnmb)
            maxnmb = b[i];
        //修改3  调整负号到分子
        if (a[i] > 0 && b[i] < 0)
        {
            a[i] = -a[i];
            b[i] = -b[i];
        }
        else if (a[i] < 0 && b[i] < 0)
        {
            a[i] = -a[i];
            b[i] = -b[i];
        }
    }
    long long n = maxnmb;//labs(b[0]); //修改4  从最大数开始找最小公倍数
    //修改,这里去掉了中间变量m
    while (1) {
        for (i = 0; i < N; i++)
        {
            if (n % b[i] != 0) {
                break;
            }
        }
        if (i == N) break;
        n++;
    }
    //修改 两个for循环合并
    long long suma = 0, sumb;
    for (i = 0; i < N; i++)
    {
        long long m = n / b[i];
        a[i] *= m;
        b[i] *= m;
        suma += a[i]; //求和 放在这里就可以了
    }
    sumb = b[0];

    //后面的处理太繁琐,修改如下:
    char flag = '+';
    if (suma < 0)
    {
        flag = '-';
        suma = -suma;
    }
      
    long long zs = suma / sumb;
    long long yushu = suma % sumb;

    if (yushu == 0)
    {
        if (flag == '-')
            printf("-%lld", zs);
        else
            printf("%lld", zs);
        return 0;
    }



    //计算余数跟分母的公约数
    long long yueshu = gys(sumb,yushu);
    yushu /= yueshu;
    sumb /= yueshu;
    if (zs == 0)
    {
        if (flag == '-')
            printf("-%lld/%lld", yushu, sumb);
        else
            printf("%lld/%lld", yushu, sumb);
    }
    else
    {
        if (flag == '-')
            printf("-%lld -%lld/%lld", zs,yushu, sumb);
        else
            printf("%lld %lld/%lld",zs, yushu, sumb);
    }
       




    /*
    for (i = 0; i < N; i++) {
        suma += a[i];
    }*/
    /*
    long long k, max = (suma >= sumb) ? suma : sumb;
    for (i = max; i > 0; i--) {
        if (suma % i == 0 && sumb % i == 0) {
            k = i;
            break;
        }
    }
    int j = 0;
    if (labs(suma) < labs(sumb)) {
        suma /= k;
        sumb /= k;
        printf("%lld/%lld\n", suma, sumb);
    }
    else if (suma % sumb == 0 && labs(suma) >= labs(sumb)) printf("%d\n", suma / sumb);
    else {
        suma /= k;
        sumb /= k;
        for (i = 0; i < n; i++) {
            if (suma < sumb) {
                printf("%d %lld/%lld\n", j, suma, sumb);
                break;
            }
            suma -= sumb;
            j++;
        }
    }*/
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632