除法表达式
【题目描述】
经过无尽的蘑菇和无尽的不知道错在哪里、不知道发生了什么只下,恭喜KZ成功的造出了数据!!可喜可贺可喜可贺
给出一个这样的除法表达式:X1/X2/X3/X4/X5/X6..../Xk,
正常的除法表达式是从左往右计算的,但是我们可以向其中添加括号,以改变它的运算顺序,如1/2/1/2=1/4 , (1/2)/(1/2)=1 ;
那么, 给定一个除法表达式,能否通过添加括号使它的值为正整数?
【输入格式】
多行
每行一个除法表达式
【输出格式】
多行
对应输入,分别输出“YES”(能为正整数)或“NO”(不能为正整数)
【样例输入】
8/4/7/10/99 6/8/5/2/3
【样例输出】
YES NO
【提示】
3<=k<=10000 , 0<X<=0x7fffffff
【来源】
《算法竞赛入门经典(第2版)》第10章
题意 : 在任意位置处添加括号,问是否使得运算的结果是一个整数
思路分析 : 显然对于一个除法表达式,第一个元素一定是在分子的位置上,第二个元素一定是在分母的位置上,其余所有的元素都是在分子上,不断的求gcd约分即可,直到分母为 1 ,代表可以,否则是不可以。
代码示例 :
#define ll long long const ll maxn = 5e5+5; const ll mod = 1e9+7; const double eps = 1e-9; const double pi = acos(-1.0); const ll inf = 0x3f3f3f3f; char s[maxn]; ll num[10005]; ll gcd(ll a, ll b){ return b==0?a:gcd(b, a%b); } int main() { freopen("baoquansl.in", "r", stdin); freopen("baoquansl.out", "w", stdout); while(~scanf("%s", s)){ ll len = strlen(s); s[len] = '/'; ll f = 0, k = 1; for(ll i = 0; i <= len; i++){ if (s[i] == '/') {num[k++] = f; f = 0;} else { f = f*10+(s[i]-'0'); } } //for(ll i = 1; i <k; i++) prllf("%d ", num[i]); swap(num[1], num[2]); ll sign = 0; for(ll i = 2; i < k; i++){ ll g = gcd(num[1], num[i]); num[1] /= g; } if (num[1] == 1) printf("YES\n"); else printf("NO\n"); } return 0; }
东北日出西边雨 道是无情却有情