Prime and GCD

素数

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

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

对于任何正整数,因子总是成对出现。所以只要要判断的数nn22~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=k1d,y=k2dx=k_1\cdot d,y=k_2\cdot dk1,k2k_1,k_2互质

gcd(y,x%y)=gcd(k2d,(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);
}