素数的判断
一、朴素判定
bool isPrime(int n) { if (n == 1) { return false; } for (int i = 2; i * i <= n; ++ i) { if (n % i == 0) { return false; } } return true; }
二、欧拉筛判断素数
1 int isPrime[maxn]; 2 void getPrime(int n) { 3 memset(isPrime, 1, sizeof(isPrime)); 4 for (int i=2;i<=n;++i) { 5 if (!isPrime[i]) continue;//已经不是素数的数其n(n>1)倍也不是素数 6 for (int j=i*2;j<=n;j+=i) { 7 isPrime[j]=false; 8 }//一个数的n倍一定不是素数(n>1) 9 }//把所有不是素数的数字标记 10 }
三、线性筛判断素数
/*原理: 1. 任何一个合数都可以表示成一个质数和一个数的乘积 2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有: A = x * y; (假设y是质数,x合数) x = a * b; (假设a是质数,且a < x——>>a<y) -> A = a * b * y = a * Z (Z = b * y) 即一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积! 理解if(i%prime[ j ]==0)是关键。 */ int isPrime[maxn];//相当于判断该数字是不是质数的bool变量 int totprime, primes[maxn];//tot表素数个数和,primes盛质数 void getPrime(int n) { memset(isPrime, 1, sizeof(isPrime)); totprime=0; for (int i=2;i<=n;++i) { if (isPrime[i]) { primes[totprime ++]=i; } for (int j=0,k;j<totprime&&i*primes[j]<=n;++j){ k=i*primes[j]; isPrime[k]=false; if (i%primes[j]==0) { break; } } } }
四、1-n所有约数的和
#include <iostream> using namespace std; int main() { int n; long long ans=0; cin>>n; for (int i=1;i<=n;++i) { ans+=(long long)i*(n/i); } cout<<ans<<endl; }