Po主剛剛考完計算概論....心情低落...
好氣啊..昨天看到這題了...今天還是腦子一團漿糊....TAT
總結一發,吸取教訓!努力學習!!
//題目描述:
第一行輸入,n
第二行輸入n個數,輸出這n個數的最大公約數和最小公倍數。
先求兩個數的公因數。
輾轉相除法原理:假設我們要求的是x和y的最大公約數(x>y),x可以表示為x=ay+b,那么x和y的公約數c也必能整除b,即x和y的公約數和y和b的公約數是相同的,若一直取除數和余數作為新的x和y,直到y是x的因數,此時y就是最大公約數(最大公約數不可能比兩個數的最小數大)。//考試的時候就是這里有些沒想清楚,光想着背代碼了
int gys(int x,int y){ int b; if(x<y){ //將大的數排在前面 b=x; x=y; y=b; } while(x%y!=0){ //一直循環直到y是x的因數 b=x%y; x=y; // 不斷取除數 作為x y=b; //不斷取余數 作為y } return y; //當y是x的因數時,y就是最大公因數 }
有了兩個數的最大公因數,最小公倍數就好辦了。
int gbs(int x,int y){ int result=(x*y)/(gys(x,y)); return result; }
那怎么求n個數的最大公因數和最小公倍數呢?//這里我考試的時候也沒想清楚...我好菜啊QAQ
這樣子考慮,當n=1的時候,最大公因數和最小公倍數都是第一個數a;
當n=2的時候,最大公因數和最小公倍數是第一個數a和第二個數b的最大公因數x和最小公倍數y。
當n=3的時候,最小公倍數就是y和第三個數c的最小公倍數,這很好理解;那么最大公因數呢?就是x與c的最大公因數 //沒想到啊當時腦子太亂了TAT
int main(){ int n; scanf("%d",&n); int i,x,y; scanf("%d",&x); int gyshu=x,gbshu=x; for(i=1;i<n;i++){ scanf("%d",&y); gyshu=gys(gyshu,y); gbshu=gbs(gbshu,y); } printf("%d %d",gyshu,gbshu); }
寫完發現好簡單啊!!!!
我的心在滴血!!!
欲哭無淚!!!
貼一個總代碼:
#include <stdio.h> #include <malloc.h> //碾除法 int gys(int x,int y){ int b; if(x<y){ //將大的數排在前面 b=x; x=y; y=b; } while(x%y!=0){ //一直循環直到y是x的因數 b=x%y; x=y; // 不斷取除數 作為x y=b; //不斷取余數 作為y } return y; //當y是x的因數時,y就是最大公因數 } int gbs(int x,int y){ int result=(x*y)/(gys(x,y)); return result; } int main(){ int n; scanf("%d",&n); int i,x,y; scanf("%d",&x); int gyshu=x,gbshu=x; for(i=1;i<n;i++){ scanf("%d",&y); gyshu=gys(gyshu,y); gbshu=gbs(gbshu,y); } printf("%d %d",gyshu,gbshu); }
很難過了,但是還是要去復習集合論與圖論,畢竟周二還要考試 :)。