除法表达式

Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 279 Accepted: 68
Description
给出如下除法表达式E:X1/X2/X3/…/Xk
其中Xi是正整数并且Xi<=2 000 000 000(1<=i<=k,k<=10 000)。除法表达式应当按照从左到右的顺序求结果,例如
表达式1/2/1/2的值是1/4。现在让你可以在表达E中嵌入括号以改变计算顺序,例如表达式(1/2)/(1/2)的值是1。现在给你一个除法表达式E,要求告诉是否能够通过加括号(或者不加)得到表达式E’ ,E’的值为整数。
Input
输入数据包括多组数据,每组数据占一行,给出的是题目描述的表达式E,E中不含空格。
Output
每个测试数据占一行如果能找到题目中描述的E’ 则输出"YES"(不含引号),否则输出"NO" (不含引号)。
Sample Input
1/2/1/2
2/3
Sample Output
YES
NO
Source
TOJ
Uploader
crq

思路
本题中,无论如何加括号, X 1 X_1 X1都是分子, X 2 X_2 X2都是分母,而加括号的唯一作用就是将 X 3 X_3 X3之后的数由分母变为分子,并且是任意选择的。那么本题的目标是将表达式结果转为整数,那么显然,要将尽量多的分母转为分子(只有除法才可能产生小数),那就是将所有的 X 3 X_3 X3及之后的分母转为分子。因此得到表达式:
E = X 1 ∏ i = 3 k ( X i ) X 2 E=\frac{X_1\prod_{i=3}^k(X_i)}{X_2} E=X2X1i=3k(Xi)
那为了判断表达式 E E E是否为整数,就将 X 2 X_2 X2于其余 X i X_i Xi值相约,看 X 2 X_2 X2最终能否被约成1即可。

代码

#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;

string expression;
int number[10001];
int InitNumber() {
	int Cnt = -1, temp = 0;
	for (const char& el : expression) {
		if (el == '/') {
			number[++Cnt] = temp;
			temp = 0;
		}
		else {
			temp *= 10;
			temp += el - '0';
		}
	}
	number[++Cnt] = temp;
	return Cnt;
}

//gcd(a,b)=gcd(b,a%b)
//gcd(a,0)=a
int gcd(int a, int b) {
	while (b) {
		int temp = a % b;
		a = b;
		b = temp;
	}
	return a;
}

void Compute(const int& Length) {

	number[1] /= gcd(number[1], number[0]);

	for (int i = 2; i <= Length; ++i) {
		number[1] /= gcd(number[i], number[1]);
	}
}

void Output(const int& Length) {

	if (Length == 0) {
		puts("Yes");
	}
	else {
		if (number[1] == 1) {
			puts("Yes");
		}
		else {
			puts("No");
		}
	}
}

int main(){

	cin >> expression;

	const int&& Length = InitNumber();

	Compute(Length);

	Output(Length);

	system("pause");
	return 0;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值