常识

最大公约数(GCD)

辗转相除法(欧几里得算法)

// ChatGPT

假设我们要计算两个正整数 a 和 b 的最大公约数,步骤如下:

  1. 用较大的数 a 除以较小的数 b,得到余数 r。
  2. 如果余数 r=0,则 b 就是 a 和 b 的最大公约数。
  3. 如果 r ≠ 0,则将 a 赋值为 b,将 b 赋值为 r,重复步骤 1,直到余数为 0。

通过不断用较大的数除以较小的数,可以不断缩小问题规模,最终得到最大公约数。

最小公倍数(LCM)

LCM = (a * b) / GCD(a, b)

判断素数

注意: 1不是素数!2是素数!

// ChatGPT

判断方法:

  1. 简单方法:从 2 到 n−1 的每个数都尝试除 n。如果 n 能被其中任何一个数整除,那么 n 就不是素数。
  2. 优化方法:只需检查从 2 到 根号n 的数即可。因为如果一个数 n 能被大于 根号n 的数整除,则它必定也能被小于 根号n 的数整除。检查从 3 到 sqrt(n) 的奇数.

完美的素数

如果一个素数是完美的素数,当且仅当它的每一位数字之和也是一个素数。

三边求三角形面积

海伦公式

image-20241110164109130

XOR运算

//ChatGPT

异或运算是二进制中的一种逻辑操作,符号是 ^
对于两个二进制位(bit):
如果两个位 相同,结果为 0
如果两个位 不同,结果为 1

异或的特点

  1. 对称性
    A⊕B=B⊕A

  2. 自反性
    A⊕A=0

  3. 还原性:

    (A⊕B)⊕B=A

    这条特性特别重要,它使异或运算常被用于加密和解密。

数组

清空缓存区

连续输入时要记得清空缓存区,否则就会出现奇怪的bug

  1. 使用scanf()

    scanf("%*[^\n]"); 
    scanf("%*c");
  2. 使用while()

    while((ch = getchar()) != ‘\n’ && ch != EOF);

    万能语句

  3. 使用fflush()

    fflush(stdin);