亦行之 2024-03-06 14:23 采纳率: 34.5%
浏览 2

PAT1062c语言无法得出正确答案

img


代码:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//最大公约数1034
int cmp(const void *a,const void *b){
    return *(int *)a-*(int *)b;//升序 
}
int gys(int a,int b){ //公约数 
    int y=a%b;
    while(y){
        a=b;
        b=y;
        y=a%b;
    }
    return b;
} 
int main()
{
    int n1,m1,n2,m2,k;
    scanf("%d/%d",&n1,&m1);
    scanf("%d/%d",&n2,&m2);
    scanf("%d",&k);
    n1=n1*k;//m1不变
    n2=n2*k; 
    //寻找最大公约数 
    if(gys(n1,m1)!=m1)//存在公约数 才进行除法 
    {
    int gy_1=gys(n1,m1);
    n1=n1/gy_1;//7*2/3 分子分母化为最简
    m1=m1/gy_1;
    }
    if(gys(n2,m2)!=m2){
    int gy_2=gys(n2,m2); 
    n2=n2/gy_2;
    m2=m2/gy_2; 
    }
    //14/3和39/5   70/15,117/15
    n1=n1*m2;n2=n2*m1;
    m1=m1*m2;m2=m1;//通分
    int x=0;
    int end[10001];//存储符合条件的 
//    for(iny i=0;i<) 
    if(n1<n2){
        for(int i=n1;n1<n2;n1++){
            if(i%m1==0){//能整除 
                end[x]=i/m1;
                x++;
            }
        }
    } 
    if(n1>n2){
        for(int i=n2;n2<n1;n2++){
            if(i%m1==0){
                end[x]=i/m1;
                x++;
            }
        }
    } 
    int len=x;//能整除的个数代表着end数组的长度 
    qsort(end,len,sizeof *end,cmp);
    for(int i=0;i<len;i++){
        printf("%d/%d ",end[i],k);
    } 
    return 0;
 } 

在devc++中运行时,输入测试案例,无法得到输出,且提交到pta后全部报错,请问我的代码哪里有问题?

  • 写回答

5条回答 默认 最新

  • 关注

    亦行之 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    在你的代码中,主要存在以下问题:

    1. 在计算最大公约数(gys)时,如果m1或m2为零,会导致程序崩溃。你应该在计算之前添加一个判断条件来确保m1和m2不为零。

    2. 在寻找最大公约数时,你的代码使用了辗转相除法的方法,但是处理逻辑不正确。你应该在循环中交换a和b的值,然后在循环外返回b。请参考以下修改后的gys函数:

    int gys(int a, int b) {
        if(b == 0)
            return a;
        
        int temp;
        while(b != 0) {
            temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
    
    1. 在通分操作中,你将m2赋值给m1,这是不正确的。你应该将m2赋值给m1,而不是相反。请修正以下代码:
    n1 = n1 * m2;
    n2 = n2 * m1;
    m1 = m1 * m2;
    
    1. 在判断n1和n2大小以及后续循环中,你的条件判断有问题。在for循环中,应该判断n1和n2的大小关系,并且循环条件应该是n1和n2的绝对值的差值不大于m1。请参考以下修改后的代码:
    if (n1 < n2) {
        for (int i = n1; n1 < n2 && abs(n1 - n2) <= m1; n1++) {
            if (i % m1 == 0) {
                end[x] = i / m1;
                x++;
            }
        }
    } 
    if (n1 > n2) {
        for (int i = n2; n2 < n1 && abs(n1 - n2) <= m1; n2++) {
            if (i % m1 == 0) {
                end[x] = i / m1;
                x++;
            }
        }
    }
    

    请尝试以上修改,并重新运行你的代码。如果还有问题,请提供错误报告或错误信息,以便更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月6日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真