一,素数
1,素数(质数prime numbers)
- 只有被1和它本身能整除的正整数(自然数),否则就是合数
- 1不是素数,2是素数
2,代码编程
获取素数的办法
方法一:对每个自然数从2求模到它本身-1
for (int i = n; i <= m; ++i) { if (i == 1) continue; bool is_prime = true; for (int j = 2; j < i; ++j) { if (i % j == 0) { is_prime = false; break; } } if (is_prime) { cout << i << endl; } }
方法二:每个素数*非1的自然数=合数,先求出前面的素数再跳过合数部分再次获取素数
#define MAX 100000 int su[MAX],cnt; // 下标逻辑不对的话会造成(因局部初始化)的错误 bool isprime[MAX]; void prime() { memset(isprime,1,sizeof(isprime)); isprime[0]=isprime[1]=0; cnt=1; for(int i=2;i<MAX;i++) { if(isprime[i]) su[cnt++]=i; // su[]保存素数的值 for(int j=1;j<cnt&&su[j]*i<MAX;j++) isprime[su[j]*i]=0; // 质数*(2到cnt之间)搜索出前面的非质数 } }
二,最大公约数
辗转相除法:手写除法时,最后除下来的是最大公约数
// 递归实现 int f(int x, int y) { if (y == 0) return x; else return f(y, x % y); }
三,最小公倍数
两个数的乘积=该两个数的最大公约数乘以最小公倍数