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); }
很难过了,但是还是要去复习集合论与图论,毕竟周二还要考试 :)。