__int64 gcd(__int64 a, __int64 b) { switch (rand() % 3) { case 0: return gcdEU_R(ABS(a), ABS(b)); case 1: return gcdEU(ABS(a), ABS(b)); default: return gcdCN(ABS(a), ABS(b)); } }
__int64 gcdEU_R(__int64 a, __int64 b) { //assert: 0 <= min(a, b) return (0 == b) ? a : gcdEU_R(b, a % b); }
/****************************************************************************************** * 测试GCD ******************************************************************************************/ int main(int argc, char* argv[]) { // 检查参数 if (3 > argc) { fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]); return 1; } srand((unsigned int)time(NULL)); // 计算GCD do { __int64 a = _atoi64(argv[1]), b = _atoi64(argv[2]); printf("Chinese: GCD(%22I64d,%22I64d) = %22I64d\n", a, b, gcdCN(ABS(a), ABS(b))); printf("Euclidean: GCD(%22I64d,%22I64d) = %22I64d = %22I64d\n", a, b, gcdEU(ABS(a), ABS(b)), gcdEU_R(ABS(a), ABS(b))); printf("Random: GCD(%22I64d,%22I64d) = %22I64d = %22I64d\n\n", a, b, gcd(a, b), gcd(a, b)); argc -= 2; argv += 2; } while (2 < argc); // 随机计算GCD for (int i = 0; i < 9; i++) { __int64 a = (__int64)rand()*rand()*rand()*rand(), b = (_int64)rand()*rand()*rand()*rand(); printf("Chinese: GCD(%22I64d,%22I64d) = %22I64d\n", a, b, gcdCN(ABS(a), ABS(b))); printf("Euclidean: GCD(%22I64d,%22I64d) = %22I64d = %22I64d\n", a, b, gcdEU(ABS(a), ABS(b)), gcdEU_R(ABS(a), ABS(b))); printf("Random: GCD(%22I64d,%22I64d) = %22I64d = %22I64d\n\n", a, b, gcd(a, b), gcd(a, b)); } return 0; }