SDUST OJ輾轉相除法求最大公約數與最小公倍數
阿新 • • 發佈:2019-01-14
題目在介紹裡面已經透露了很大一部分資訊,所以只要動一丟丟腦筋就可以啦,讓我們來看一下程式碼吧:
#include <stdio.h> int gcd(int a,int b) { return b? gcd(b,a%b) : a; } int lcm(int a,int b) { int m,n,c; m=a*b; n=m/gcd(a,b); return n; } int main() { int a,b; while(scanf("%d %d",&a,&b)==2) printf("%d %d\n",gcd(a,b),lcm(a,b)); return 0; }
程式碼看上去十分的簡潔,因為只要遵循題意來就好了呀,這裡運用了三目運算子,可以減少不少的程式碼量;
讓我們再來看一下VJ上杭電的水題。既然說了這是水題的話那就說明這個題目本身是不怎麼難的。
但是初步看上去要求n個數的最小公倍數,一個一個記錄下來求的話好像是有點麻煩,那麼有沒有好的方法呢???
當然是有的呀,不然我也不會說哈哈哈哈~~~~~~
先看程式碼吧:
unsigned long lcm(unsigned long a,unsigned long b) { unsigned long m,n,c; m=a,n=b; c=a%b; while(c!=0) { a=b; b=c; c=a%b; } return m*n/b; } int main() { int n,i; unsigned long t; while(scanf("%d",&n)!=EOF) {//必須用unsigned long型,最後可能為32位的整數 unsigned long x=1; for(i=1;i<=n;i++) { scanf("%ld",&t); x=lcm(x,t); } printf("%d\n",x); } return 0; }
這裡我沒有寫一個求最大公因數的函式gcd,為的就是讓大家能看懂gcd的來源;
在一開始我設立了一個x=1,因為1與任何數的最大公倍數都是它本身,所以,1的設立尤為重要,x=lcm(x,t)是整個程式碼的核心,他實現了得到多個數的最小公倍數。
這裡的資料型別我設定的是unsigned long型,其實再開大一點也沒有關係,但如果開小了的話就會資料溢位。
謝謝大家的關注,我會持續更博的。 T H A N K Y O U F O R W A T C H ! ! !