C中的编译时LCM/GCD

har*_*ngt 2 c gcc visual-c++

有谁知道一个机制,在编译时计算至少两个号的LCM(最小公倍数)和/或GCD(最大公约数)Ç(不是C++,我知道模板魔法可有)?

我通常使用GCC并回想一下,当所有输入都已知时,它可以在编译时计算某些值(例如:sin,cos等等).

我正在寻找如何在GCC中执行此操作(最好以其他编译器可以处理的方式)并希望相同的机制可以在Visual Studio中工作.

Kev*_*vin 5

我事后想通了......

#define GCD(a,b) ((a>=b)*GCD_1(a,b)+(a<b)*GCD_1(b,a))
#define GCD_1(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_2((b), (a)%((b)+!(b))))
#define GCD_2(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_3((b), (a)%((b)+!(b))))
#define GCD_3(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_4((b), (a)%((b)+!(b))))
#define GCD_4(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_5((b), (a)%((b)+!(b))))
#define GCD_5(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_6((b), (a)%((b)+!(b))))
#define GCD_6(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_7((b), (a)%((b)+!(b))))
#define GCD_7(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_8((b), (a)%((b)+!(b))))
#define GCD_8(a,b) ((((!(b)))*(a)) + (!!(b))*GCD_last((b), (a)%((b)+!(b))))
#define GCD_last(a,b) (a)

#define LCM(a,b) (((a)*(b))/GCD(a,b))


int main()
{
    printf("%d, %d\n", GCD(21,6), LCM(21,6));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,根据整数的大小,您可能需要包含更多中间步骤(即GCD_9,GCD_10等).

我希望这有帮助!