一 、判某一质数
bool is_prime(int n) {
for(int i=2;i<=sqrt(n);++i) {
if(n%i==0) return false;
}
return true;
}
二、分解质因数
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,cnt,p[1001],c[1001];
void div() {
int x=n;
for(int i=2;i*i<=n;++i) {
if(x%i==0) {
p[++cnt]=i;
while(x%i==0) {
x/=i;
c[cnt]++;
}
}
}
if(x>1) p[++cnt]=x,c[cnt]++;
}
int main()
{
scanf("%d",&n);
div();
for(int i=1;i<=cnt;++i)
printf("%d^%d
",p[i],c[i]);
return 0;
}
三、求正约数集合
·N本身
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,cnt,factor[1001];
void Get() {
for(int i=2;i*i<=n;++i) {
if(n%i==0) {
factor[++cnt]=i;
if(i*i!=n) factor[++cnt]=n/i;
}
}
}
int main()
{
scanf("%d",&n);
Get();
for(int i=1;i<=cnt;++i) {
printf("%d ",factor[i]);
}
return 0;
}
·拓展——1~N(倍数法)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int> v[1001];
void Sol() {
for(int i=1;i<=n;++i) {
for(int j=1;i*j<=n;++j) {
v[i*j].push_back(i);
}
}
}
int main()
{
scanf("%d",&n);
Sol();
for(int i=1;i<=n;++i) {
printf("%d: ",i);
for(int j=0;j<v[i].size();++j) {
printf("%d ",v[i][j]);
}
printf("
");
}
return 0;
}
时间复杂度O(N + N/2 +N/3 ……+N/N) =O(NlogN)
倍数法的推论
1~N 每个数的约束个数总和大约为 NlogN