列表

详情


HJ82. 将真分数分解为埃及分数

描述

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。



输入描述

输入一个真分数,String型

输出描述

输出分解后的string

示例1

输入:

8/11
2/4

输出:

1/2+1/5+1/55+1/110
1/3+1/6

说明:

第二个样例直接输出1/2也是可以的

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 280KB, 提交时间: 2021-01-09

#include <stdio.h>
int DG(int a, int b)
{
	if(b) return DG(b, a%b);
	return a;
}
int main(void)
{
	int a, b, tmp;
	for( ; scanf("%d/%d", &a, &b)!=EOF; ){
		if((tmp=DG(a,b))!=1){ a/=tmp;   b/=tmp; }
		if(a==1){ printf("%d/%d\n", a, b);   continue; }
		for( ; a!=1; ){
			tmp = b/a+1;
			printf("1/%d+", tmp);
			a -= b%a;
			b *= tmp;
			if((tmp=DG(a,b))!=1){ a/=tmp;   b/=tmp; }
		}
		printf("1/%d\n", b);
	}
	return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 348KB, 提交时间: 2020-11-22

#include <stdio.h>

int main()
{
    int a,b,c;
    while(EOF != scanf("%d/%d\n", &a, &b))
    {
        while(1 != a)
        {
            if(0 == b%a)
            {
                printf("1/%d",b/a);
                a=1;
                break;
            }
            else
            {
                c=b/a+1;
                printf("1/%d+",c);
                a=a*c-b;
                b=b*c;
                if (3==a&&0==(b%2))
                {
                    printf("1/%d+1/%d",b/2,b);
                    a=1;
                    break;
                }
            }
        }
        printf("\n");
    }
    return 0;
}

上一题