ddddddddddcccccccccc 2022-04-02 10:03 采纳率: 76.9%
浏览 76
已结题

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

这个是题目

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;
}
  • 写回答

2条回答 默认 最新

  • 关注

    有几个问题:
    (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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月9日
  • 已采纳回答 4月2日
  • 修改了问题 4月2日
  • 修改了问题 4月2日
  • 展开全部

悬赏问题

  • ¥20 易康econgnition精度验证
  • ¥15 线程问题判断多次进入
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致