题解 | #将真分数分解为埃及分数# HJ82

将真分数分解为埃及分数

https://www.nowcoder.com/practice/e0480b2c6aa24bfba0935ffcca3ccb7b

#include <stdio.h>//自测运行失败了,说你自己判断,你是对的就直接去运行,最后一个4字节会溢出,最后我换为了long
void fenshujian(long* x1,long* y1,long* x2,long* y2){ //第一个分数减第二个分数,结果放到第一个分数的位置上
    long x=0,y=0;
    y=(*y1)*(*y2);
    x=(*x1)*(*y2)-(*x2)*(*y1);
    *x1=x;
    *y1=y;
    return ;
}
int main() {
    long a, b,tempx=0,tempy=0,beix=1,beiy=0,arr[50]={0},top=0;   //数组用来放分子为1,分母为符合的结果
    while (scanf("%ld/%ld\n", &a, &b) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        tempx=a,tempy=b,beix=1;
        for(long i=2;;i++){                         //从1/2开始
            beiy=i;
            if(tempx*i>=tempy){                    //1/2小于真分数,就减去1/2
                arr[top++]=i;
                fenshujian(&tempx,&tempy,&beix,&beiy);    //减去1/2
                if(tempx==0){                              //真分数和1/2相等,直接返回
                    break;
                }
                if(tempy%tempx!=0){                    
                    continue;
                }
                else{                                       
                    long dp=0;dp=tempy/tempx;        //减去后是分子为一的就返回
                    arr[top++]=dp;
                    break;
                }
            }
        } 
        for(int i=0;arr[i]!=0;i++){   //输出
            printf("1/%ld",arr[i]);
            if(arr[i+1]!=0){
                printf("+");
            }
        }
        printf("\n");   
    }
    
    return 0;
}

全部评论

相关推荐

04-06 16:59
已编辑
河南工业大学 Java
牛牛牛的牛子:最好扔了,实在没有选择的选择
点赞 评论 收藏
分享
工科女的日常:真诚建议:别再用这种花哨的模板,可以看看我发的那个零经验找实习发帖子
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务