题目描述
用筛法求之N内的素数。
输入
N
输出
0~N的素数
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
代码1
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
a[i]=i;//存储n之内的每一位
for(int i=2;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(a[i]!=0&&a[j]!=0&&a[j]%a[i]==0)//首先排除掉已经去掉的数,然后判断是否是素数
{
a[j]=0;
}
}
}
for(int i=2;i<n;i++)//1既不是素数也不是合数,去掉
{
if(a[i]!=0)
printf("%d\n",a[i]);
}
return 0;
}
代码2
#include<iostream>
using namespace std;
int a[100010];
int main()
{
int n;
cin>>n;
for(int i=2;i*i<=n;i++)
{
for(int j=i*i;j<=n;j+=i)
{
a[j]=1;
}
}
for(int i=2;i<n;i++)
if(!a[i])
cout<<i<<endl;
return 0;
}
筛选法介绍:
先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。
求取最大公约数
欧几里得算法
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a, int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
更加快速(结合欧几里得,更相减损法,移位运算)
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a, int b)
{
if(a==0) return b;
if(b==0) return a;
if(a%2==0&&b%2==0) return 2*gcd(a>>1,b>>1);
else if(a%2==0) return gcd(a>>1,b);
else if(b%2==0) return gcd(a,b>>1);
else return gcd(abs(a-b),min(a,b));
}
int main()
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}