gpt4 book ai didi

C 中的编译时 LCM/GCD

转载 作者:行者123 更新时间:2023-12-02 09:02:27 26 4
gpt4 key购买 nike

有谁知道在编译时计算 C(不是 C++)中至少两个数字的 LCM(最小公倍数)和/或 GCD(最大公分母)的机制,我知道那里有模板魔法)?

我通常使用 GCC,并记得它可以在所有输入已知的情况下在编译时计算某些值(例如:sin、cos 等)。

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

最佳答案

我终于明白了……

#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;
}

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

我希望这会有所帮助!

关于C 中的编译时 LCM/GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com