hdu acmsteps 2-1-3相遇週期

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1813 Accepted Submission(s): 846
 
Problem Description
2007年3月26日,在中俄兩國元首的見證下,中國國家航天局局長孫來燕與俄羅斯聯邦航天局局長別爾米諾夫共同簽署了《中國國家航天局和俄羅斯聯邦航天局關於聯合探測火星-火衛一合作的協議》,確定中俄雙方將於2009年聯合對火星及其衛星“火衛一”進行探測。

而衛星是進行這些探測的重要工具,我們的問題是已知兩顆衛星的運行週期,求它們的相遇週期。
 
Input
輸入數據的第一行爲一個正整數T, 表示測試數據的組數. 然後是T組測試數據. 每組測試數據包含兩組正整數,用空格隔開。每組包含兩個正整數,表示轉n圈需要的天數(26501/6335,表示轉26501圈要6335天),用\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'隔開。
 
Output

            對於每組測試數據, 輸出它們的相遇週期,如果相遇週期是整數則用整數表示,否則用最簡分數表示。
 
Sample Input
2
26501/6335 18468/42
29359/11479 15725/19170
 
Sample Output
81570078/7
5431415
 
 
Source
HDU 2007-Spring Programming Contest
 
Recommend
lcy

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
/*搜的解題報告
說白了就是分數的GCD.
輸入 a/b c/d
轉換後變成:
(a*d)/(b*d) 和 (c*b)/(b*d)
按照題意,就是在轉相同的圈子(b*d圈)時,各自需要時間a*d和c*b.
所以,這裏把a*d與c*b的最小公倍數求出來就可以了。
這樣。求出的最小公倍數lcm再除以(b*d)就是所求的週期。
(http://www.wutianqi.com/)
但是,這裏要求若無法整出,則寫出分數形式,這時,
就可以求lcm與(b*d)的最大公約數gcd,
求出gcd後與(b*d)比較,若相等,則證明可以整除~~~~
然後就可以AC了。。。*/


using namespace std;
_int64 gcd(_int64 n,_int64 m)
{
    if(m==0)
	 return n;
	return gcd(m,n%m);
}

int main()
{
    int n;
     _int64 a,b,c,d,t1,t2,t3,t4,t5,t6;
    scanf("%d",&n);//注意不能爲while(~scanf("%d",&n)),否則超時
	while(n--)
      {
            scanf("%I64d/%I64d%I64d/%I64d",&a,&b,&c,&d);
            //printf("%d%d%d%d",a,b,c,d);
			t1=a*d;
			t2=c*b;
			t3=b*d;
			t4=gcd(t1,t2);
			t5=t1/t4*t2;
			t6=gcd(t5,t3);
			t5/=t6;
			t3/=t6;
			if(t3==1)
            {
                printf("%I64d\n",t5);
            }
            else
            { 
				printf("%I64d/%I64d\n",t5,t3);
               
            }
	}
    
    return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章