Prime and GCD

素数

素数是什么?见小学数学书

如何判断一个数是否是素数?

对于任何正整数,因子总是成对出现。所以只要要判断的数nn在22~n\sqrt{n}之间没有因子,nn就是质数

1
2
3
4
5
6
7
8
9
bool isPrime(int a)
{
if (a < 2)
return 0;
for (int i = 2; i * i <= a; ++i)
if (a % i == 0)
return 0;
return 1;
}

GCD

GCD(Greatest Common Divisor) 最大公约数

其实C++有内置的GCD函数,但是因为某种原因,建议不要使用!

再一次翻一翻你的小学数学课本,老师肯定教过你辗转相除求最大公约数

好习惯,使用前先证明:

证明

设gcd⁡(x,y)=d\gcd(x,y)=d,则此时x=k1⋅d,y=k2⋅dx=k_1\cdot d,y=k_2\cdot d 且k1,k2k_1,k_2互质

∴gcd⁡(y,x%y)=gcd(k2⋅d,(k1%k2)⋅d)\therefore \gcd(y,x\% y)=gcd(k_2\cdot d,(k_1\% k_2)\cdot d)

∵gcd⁡(k2,k1%k2)=1\because \gcd(k_2,k_1\% k_2)=1

∴gcd(y,x%y)=d\therefore gcd(y,x\% y)=d

∴\therefore得证

然后贴个代码:

1
2
3
4
5
6
int gcd(int a, int b) 
{
if (b == 0)
return a;
return gcd(b, a % b);
}