0001 #include "_share/util.h" 0002 0003 #define ABS(x) ( (0 < (x)) ? (x) : (-(x)) ) 0004 0005 __int64 gcdEU_R ( __int64 a, __int64 b ); 0006 __int64 gcdEU ( __int64 a, __int64 b ); 0007 __int64 gcdCN ( __int64 a, __int64 b ); 0008 0009 __int64 gcd ( __int64 a, __int64 b ) { 0010 switch ( rand() % 3 ) { 0011 case 0: return gcdEU_R ( ABS ( a ), ABS ( b ) ); 0012 case 1: return gcdEU ( ABS ( a ), ABS ( b ) ); 0013 default: return gcdCN ( ABS ( a ), ABS ( b ) ); 0014 } 0015 } 0016 0017 /****************************************************************************************** 0018 * 测试GCD 0019 ******************************************************************************************/ 0020 int main ( int argc, char* argv[] ) { 0021 // 检查参数 0022 if ( 3 > argc ) { fprintf ( stderr, "Usage: %s <a> <b>\n", argv[0] ); return 1; } 0023 srand ( ( unsigned int ) time ( NULL ) ); 0024 // 计算GCD 0025 do { 0026 __int64 a = _atoi64 ( argv[1] ), b = _atoi64 ( argv[2] ); 0027 printf ( "Chinese: GCD(%22I64d, %22I64d) = %22I64d\n", a, b, gcdCN ( ABS ( a ), ABS ( b ) ) ); 0028 printf ( "Euclidean: GCD(%22I64d, %22I64d) = %22I64d = %22I64d\n", a, b, gcdEU ( ABS ( a ), ABS ( b ) ), gcdEU_R ( ABS ( a ), ABS ( b ) ) ); 0029 printf ( "Random: GCD(%22I64d, %22I64d) = %22I64d = %22I64d\n\n", a, b, gcd ( a, b ), gcd ( a, b ) ); 0030 argc -= 2; argv += 2; 0031 } while ( 2 < argc ); 0032 // 随机计算GCD 0033 for ( int i = 0; i < 9; i++ ) { 0034 __int64 a = 1, b = 1; 0035 for ( int k = 0; k < 4; k++ ) { //随机生成正整数a和b 0036 ( rand() & 1 ) ? a *= ( 1 + rand() ) : a += rand(); 0037 ( rand() & 1 ) ? b *= ( 1 + rand() ) : b += rand(); 0038 } 0039 printf ( "Chinese: GCD(%22I64d, %22I64d) = %22I64d\n", a, b, gcdCN ( ABS ( a ), ABS ( b ) ) ); 0040 printf ( "Euclidean: GCD(%22I64d, %22I64d) = %22I64d = %22I64d\n", a, b, gcdEU ( ABS ( a ), ABS ( b ) ), gcdEU_R ( ABS ( a ), ABS ( b ) ) ); 0041 printf ( "Random: GCD(%22I64d, %22I64d) = %22I64d = %22I64d\n\n", a, b, gcd ( a, b ), gcd ( a, b ) ); 0042 } 0043 return 0; 0044 }