除法表達式

除法表達式

給出一個這樣的除法表達式:X1/X2/X3/···/Xk,其中Xi是正整數。除法表達式應當按照從左到右的順序求和,例如表達式1/2/1/2的值爲1/4。但是可以在表達式中嵌入括號以改變計算順序,例如表達式(1/2)/(1/2)的值爲1

輸入
首先輸入一個N,表示有N組測試數據, 每組數據輸入佔一行,爲一個除法表達式, 輸入保證合法。
使表達式的值爲整數。k<=10000,Xi<=100000000
. 輸出 輸出YES或NO
樣例輸入
1
1/2/1/2
樣例輸出
YES

(1)思路:
不難知道整個表達式最後一定會變成這樣的形式:A/B

而A,B都可以表達爲這些數中某一部分的乘積。自然就會想到B越小越好,最好是1,這樣就可以變成整數了。

經過一些嘗試後會發現,**X2必然在B中,而其他數都可以在上,**這樣問題就簡單明瞭了

設 E=(X1X3X4X5X6…Xk)/X2  只需要判斷E是否爲整數即可!(ง •_•)ง

(2)方法
方一:
簡單粗暴直接算,算高精度乘法,然後看能否整除

方二:
使用唯一分解定理,把X2拆了,然後看看剩下所有的Xi們能不能貢獻出所需的pi對應的次數ai,這個方法很正確,但還可以更優化一點

方三:
沒錯就是直接約分,每次把X2除掉與Xi的gcd,這樣除k遍後如果X2是1那麼E就是整數啦

#include<iostream>
using namespace std;

const int N = 10010;
int a[N];
int n;

bool judege(int a[]);
int gcd(int x,int y);

int main()
{

	cin>>n;
	for(int i = 1;i<=n;i++)
		cin>>a[i];
	if(judege(a))
		cout<<"yes"<<endl;
	else
		cout<<"no"<<endl;
	
	return 0;
}

bool judege(int a[])
{
	a[2] /= gcd(a[2],a[1]);
	for(int i = 3;i<=n;i++)
	{
		
		a[2] = a[2]/(gcd(a[2],a[i]));
	}
	if(a[2] == 1)
			return true;
	return false;
}

int gcd(int x,int y)
{
	if(y == 0)
		return x;
	return gcd(y,x%y);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章