1.
筛选法求给定范围内的质数。
一般求法(即:已经优化到了sqrt(N) :
#include<stdio.h>
#include<math.h>
int main()
{ int i,n,x;
while(scanf("%d",&n)==1)
{ x=(int)sqrt(n);
for(i=2;i<=x;i++)
if(n%i==0) break;
if(i>x) printf("YES\n");
else printf("NO\n");
}
}
2. 经过筛选和预处理的方法:
//需求:给定N(1< N <= 100000) 打印出小于N的所有质数。
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 100001;
int main()
{
int N;
int ans[MAX];
memset(ans,0,sizeof(int)*MAX);
ans[1] = 1;
for(int i=2;i<=MAX;i++)
{
if(ans[i] == 0)//基本思想:就是将所以质数的i(i=1,2,..)的倍数都设置为非质数。
for(int j=i+i;j<=MAX;j+=i)//那么经过筛选之后的就剩下的只有质数。
ans[j] = 1;
}
while(cin>>N)
{
cout<<2;
for(int i=3;i<=end;i++)
if(ans[i] == 0)
cout<<" "<<i;
cout<<endl;
}
return 0;
}
3. 1215:
题目大意:求给定输入一个整数N(1=<N<=50000)求出N的所以真因子之和,例如:
输入:
8
10
20
输出:
7
8
22
代码如下:
//真因子之和。
//Time:93MS
//Mem :2252K
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int ans[500001];
int main()
{
memset(ans, 0, 500001*sizeof(int));//memst是按字节设置的,所以只能设置为0。
for(int i=2;i<=250000;i++)
{
for(int j = 2; i*j < 500001; j++)
ans[i*j] += i;
}
int t;
scanf("%d",&t);
int n;
while(t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]+1); //一定要用printf,效率真心差很多。
}
return 0;
}