最大公约数
int gcd(int a,int b){
if (b==0)return a;
else return gcd(b,a%b);
}
熟练了可以写成:
int gcd(int a,int b){
return b ? gcd(b,a%b):a;
}
值得注意的是:让a和b均为非负数,可以使用algorithm下的abs(int x)和cmath下的fabs(double x);
最大公倍数是在最大公约数的基础上:
最大公倍数等于
a*b/gcd(a,b)
但由于a*b可能溢出,因此可以修改为
a/gcd(a,b)*b;
素数,又称质数,是指除了1和本身之外,不能被其他整数除的一类数
值得注意的是 1 既不是素数也不是合数
在n较小时,单独素数的求解:
sqrt()函数是在头文件cmath下,并且参数为double因此求解需要写为(int)sqrt(1.0*x);
int isprime(int x){
int sqr = (int)sqrt(1.0 * x);
for (int i = 2;i <= sqr; i++){
if (x % i == 0)return 0;
}
return 1;
}
在较短时间内得到1~n的素数表,n的数量级为1e9。
若n的数量级较小可以一个一个调用isprime()
素数表的打印
const int N = 1e6+10;
int isprime[N];
void find_primes(int n){
vector<int> ans;
fill(&isprime[0],&isprime[0]+N,1);
for (int i=2;i<=n;i++){
if (isprime[i] == 1){
ans.push_back(i);
for (int j=i+i;j<=n;j=j+i){
isprime[j] = 0;
}
}
}
}