【NYOJ】[1110]分数加减法

文章字数:253

问题描述

问题分析

因为输出形式也是分数
所以这一题还是挺有意思的

思路不难 数学问题
需要考虑的特殊情况
一是结果小于0
二是结果为整数
三是结果需要化简

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
int gcd(int a,int b) {
	if(b==0)
		return a;
	else
		return gcd(b,a%b);
}
int main() {
	int a,b,c,d;
	char s;
	while(scanf("%d/%d%c%d/%d",&a,&b,&s,&c,&d)!=EOF) {
		int m,n=b*d;
		a*=n/b;
		c*=n/d;
		if(s=='+')
			m=a+c;
		else {
			if(a<c) {
				printf("-");
				m=c-a;
			} else
				m=a-c;
		}
		if(!m)
			printf("0\n");
		else if(m%n==0) {
			printf("%d\n",m/n);
		} else {
			int t=gcd(m,n);
			m/=t;
			n/=t;
			printf("%d/%d\n",m,n);
		}
	}
	return 0;
}

标程用的字符串记录算式
但思路还是一样的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
char str[20];
int Gcd(int m,int n) {
	if (m==0) return n;
	return Gcd(n%m,m);
}
int main() {
	int fz,fm,gcd;
	while(scanf("%s",str)!=EOF) {
		if(str[3]=='-')
			fz=(str[0]-'0')*(str[6]-'0')-(str[2]-'0')*(str[4]-'0');
		else fz=(str[0]-'0')*(str[6]-'0')+(str[2]-'0')*(str[4]-'0');
		if(fz) {
			fm=(str[2]-'0')*(str[6]-'0');
			gcd=Gcd(fz,fm);
			if(gcd<0) gcd=-gcd;
			if(fm/gcd==1) printf("%d\n",fz/gcd);
			else printf("%d/%d\n",fz/gcd,fm/gcd);
		} else puts("0");
	}
}

题目地址:分数加减法

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...