/**//* stein 算法求最大公约数,和欧基里德算法相比,效果更好: 主要思想如下: 化归思想 1.m为奇数时: (1)n也为奇数:gcd(m,n) = gcd((m+n)/2,(m-n)/2) ; (2)n为偶数: gcd(m,n) = gcd(m,n/2) ; 2.m为偶数时: (1) n也为偶数:gcd(m,n) = gcd(m/2,n/2); (2) n为奇数: gcd(m,n) = gcd(m/2,n); 3.m == n 时,gcd(m,n) = m 退出 */ #include <stdio.h> int stein_gcd ( int m , int n ) ...{ int temp,total=0 ; if ( m < n ) ...{ temp = m ; m = n ; n = temp ; } if ( n ==0 ) return0 ; while ( m != n ) ...{ if ( m &1) /**//* 如果m 为奇数, 因为奇数的后面总有一个1,所以可以通过与1且一下来判断是否是偶数*/ ...{ if ( n &1) /**//* m,n都为奇数*/ ...{ temp = m ; m = (m+n)>>1 ; n = (temp-n)>>1; } else ...{ n >>=1 ; } } else/**//* m为偶数 */ ...{ if ( n &1) /**//*n 为奇数*/ ...{ m >>=1 ; /**//*由于在这个过程中,m可能小于n ,所以要判断一下*/ if ( m < n ) ...{ temp = m ; m = n ; n = temp ; } } else ...{ m >>=1 ; n >>=1 ; total ++ ; /**//*记录缩小的倍数*/ } } } m <<= total ; /**//*还原大小*/ return m ; } int main(void) ...{ int m,n,max=0; scanf("%d %d",&m,&n); max = stein_gcd(m,n); printf("max= %d ",max); /**//* test while( (scanf("%d",&m)) && m != 0 ) { if ( m & 1) printf("%d是奇数 ",m); else printf("%d是偶数 ",m); } */ system("pause"); return0 ; }