社区讨论

70pts 马风良好 求条

P1572计算分数参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj2ztyh
此快照首次捕获于
2025/11/03 19:53
4 个月前
此快照最后确认于
2025/11/03 19:53
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
string s;int l,k;char op;
struct frac{
	int num,den;
}a[3];
inline int read() {
	int n=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)) {
		n=n*10+ch-'0';
		ch=getchar();
	}
	return f*n;
}
inline void write(int n) {
	if(n<0) putchar('-'),n=-n;
	if(n<10) putchar(n+'0');
	else write(n/10),putchar(n%10+'0');
}
inline int lcm(int a,int b) {
	return a/__gcd(a,b)*b;
}
int main() {
	cin>>s;
	if(s.size()==3) {
		int num=s[0]-'0',den=s[2]-'0',n=abs(__gcd(num,den));
		num/=n,den/=n;
		write(num);
		if(den!=1) putchar('/'),write(den);
		return 0;
	}
	if(s[0]=='-') {
		a[++l].num=-(s[1]-'0');
		a[l].den=s[3]-'0';
		k=4;
	}
	else if(s[2]=='-') {
		a[++l].num=-(s[0]-'0');
		a[l].den=s[3]-'0';
		k=4;
	}
	else {
		a[++l].num=s[0]-'0';
		a[l].den=s[2]-'0';
		k=3;
	}
	for(int i=k;i<s.size();i++) {
		if(s[i]=='/') {
			a[++l].num=s[i-1]-'0';
			if(s[i+1]!='-') a[l].den=s[i+1]-'0',i++;
			else a[l].den=-(s[i+2]-'0'),s[i+1]=' ',i+=2;
		}
		if(s[i]=='+'||s[i]=='-') op=s[i];
		if(l==2) {
			frac res;
			int n=abs(lcm(a[1].den,a[2].den));
			a[1].num*=n/a[1].den,a[2].num*=n/a[2].den;
			if(op=='+') res.num=a[1].num+a[2].num;
			else if(op=='-') res.num=a[1].num-a[2].num;
			res.den=n;
			int m=abs(__gcd(res.num,res.den));
			res.num/=m,res.den/=m;
			a[l=1]=res;
		}
	}
	int n=abs(__gcd(a[1].num,a[1].den));
	a[1].num/=n,a[1].den/=n;
	if(a[1].den<0) a[1].den=-a[1].den,a[1].num=-a[1].num;
	if(a[1].num!=0) write(a[1].num);
	if(a[1].den!=1) putchar('/'),write(a[1].den);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...