一。最大公约数:是能够整除两个整数的最大整数,如下三种方法:
/*1.穷举法
由于a和b的最大公约数不可能比两者的较小者还大,即检查从1~t的所有整数,满足公约数条件的t就是最大公约数。*/#include <stdio.h>#include <stdlib.h>int Gcd(int a,int b){ int t; if( a<=0 ||b<=0 ) return -1; t=a<b?a:b; for(int i=t;i>0;i--){ //从a和b的较小者t开始,逐次减1尝试每种可能 if(a%i==0&&b%i==0) return i; } return 1;}int main(){ int a,b,c; scanf("%d%d",&a,&b); c = Gcd(a,b); if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c); else printf("%d和%d无最大公约数!",a,b); return 0;}
/*2.欧几里得算法或辗转相除法 对正整数a,b进行连续的求余运算,直到余数为0为止,此时非0的除数就是最大公约数。 即Gcd(a,b)=Gcd(b,r) 例如50和15的最大公约数Gcd(50,15)=Gcd(15,5)=Gcd(5,0) */ #include <stdio.h> #include <stdlib.h> int Gcd(int a,int b){ int r; if( a<=0 ||b<=0 ) return -1; do{ r = a % b; a = b; b = r; }while(r!=0); return a; } int main() { int a,b,c; scanf("%d%d",&a,&b); c = Gcd(a,b); if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c); else printf("%d和%d无最大公约数!",a,b); return 0; }
/*3.递归 当a>b时,若a中含有与b相同的最大公约数,那么a-b中也有与b相同的最大公约数。 直到a=b为止,此时a或b就是最大公约数。 */ #include <stdio.h> #include <stdlib.h> int Gcd(int a,int b){ if( a<=0 ||b<=0 ) return -1; if(a==b) return a; else if(a>b) return Gcd(a-b,b); else return Gcd(b,b-a); } int main() { int a,b,c; scanf("%d%d",&a,&b); c = Gcd(a,b); if(c!=-1) printf("%d和%d的最大公约数为%d\n",a,b,c); else printf("%d和%d无最大公约数!",a,b); return 0; }