列表

详情


NC14519. 分数运算

描述

 bd一直对数学很感兴趣,最近她在研究分数的加减运算,现在要求计算两个分数的运算。

输入描述

输入一个正整数T,表示有T组数据,每组数据包括五个整数op,a,b,c,d,其中如果op=1,那么表示a/b+c/d; op=0,表示a/b-c/d。其中 1<=T,op,a,b,c,d<=100。

输出描述

两个分数运算的结果 x/y, 要求x/y是最简分数,输出x/y。

示例1

输入:

4
1 1 2 1 3 
0 1 2 1 2 
1 1 2 1 2
0 1 3 1 2

输出:

5/6  
0/1
1/1
-1/6

说明:

提示:
如果 x/y 是负数的时候,输出-|x|/|y|

原站题解

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

C 解法, 执行用时: 2ms, 内存消耗: 284K, 提交时间: 2022-10-26 12:24:39

#include<stdio.h>
int main()
{
    int a,b,c,d,j,h,k,n,y;
    scanf("%d",&y);
    while(y>0)
    {
    scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
     j=a*d+b*c;h=b*d; k=a*d-b*c;
    if(n==1)
     {for(int i=h;i>0;i--)if(j%i==0&&h%i==0){printf("%d/%d\n",j/i,h/i);break;}}
    else
     {for(int i=h;i>0;i--)if(k%i==0&&h%i==0){printf("%d/%d\n",k/i,h/i);break;}}
        y=y-1;
    }
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 376K, 提交时间: 2019-11-03 19:11:00

#include<iostream>
using namespace std;
int T;
int gcd(int a,int b)
{
	return b? gcd(b,a%b):a;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--)
	{
		int op,a,b,c,d;
		cin>>op>>a>>b>>c>>d;
		int y=b/gcd(b,d)*d,x=y/b*a+(op? 1:-1)*y/d*c;
		if(x<0)
		{
			cout<<'-';
			x=-x;
		}
		cout<<x/gcd(x,y)<<'/'<<y/gcd(x,y)<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 368K, 提交时间: 2020-02-14 22:19:34

#include<iostream>
using namespace std;
int T;
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--)
	{
		int op,a,b,c,d;
		cin>>op>>a>>b>>c>>d;
		int y=b/gcd(b,d)*d,x=y/b*a+(op?1:-1)*y/d*c;
		if(x<0)
		{
			cout<<'-';
			x=-x;
		}
		cout<<x/gcd(x,y)<<'/'<<y/gcd(x,y)<<endl;
	}
	return 0;
}

Python3 解法, 执行用时: 35ms, 内存消耗: 4556K, 提交时间: 2022-12-11 10:21:51

def gcd(a,b):
    if b==0:return a
    else:return gcd(b,a%b)

for i in range(int(input())):
    op,a,b,c,d=map(int,input().split())
    if op==1:x, y = a*d + b*c, b*d
    else:x, y = a*d - b*c, b*d
    s = gcd(max(abs(x), y), min(abs(x), y))
    print(str(x//s) + '/' + str(y//s))

上一题