教学方法:
1.检测每一个是不是素数.
#include<iostream>
usingnamespace std;
boolisPrimer(int x)
{
for (int i=2; i*i<=x; ++i){
if ( x%i ==0 ){
return false;
}
}
return true;
}
int main()
{
for (int i=1; i<1000; ++i){
if(isPrimer(i)){
cout<<i<<" ";
}
}
return 0;
}
2使用排除法,打印所有素数.
#include<iostream>
usingnamespace std;
voidprimer(int x)
{
bool isTure[10001];
memset(isTure,0,sizeof(isTure));
for ( int i=2; i*i<=x; ++i ){
if ( isTure[i]==true ){
continue;
}
for ( int j=i; j*i<=x; ++j ){
isTure[i*j]=true;
}
}
for ( int i=0; i<=x; ++i ){
if ( isTure[i] ){
continue;
}
cout<<i<<" ";
}
}
int main()
{
primer(1000);
return 0;
}
在工业使用上,不会采用以上两种方法,一般会实现计算出来,然后在程序中直接使用.
模板方法的核心是模板的片特化,即模板会进行递归生成类实例,当遇到片特化时候就会根据片特化模板生成类实例(模板片特化优先级比模板高),递归结束,如果没有偏特化就不会递归结束.
这里还有第三种方法,使用模板:
#include<iostream>
usingnamespace std;
staticbool result;
template<int N,int D=N-1>
structisPrimer {
enum {
result = (N%D ? true:false ) &&isPrimer<N,D-1>::result
};
};
//模板偏特化
template<int N>
structisPrimer<N,1>{
enum {
result = true
};
};
template<int M,int N>
structprintPrimer{
static void printPri(){
pirntIfPrimer<M,isPrimer<M>::result>::printIfPri();
printPrimer<M+1,N>::printPri();
}
};
template<intM>
structprintPrimer<M,M>{
static void printPri(){
pirntIfPrimer<M,isPrimer<M>::result>::printIfPri();
}
};
template<int M,bool isTrue>
structpirntIfPrimer{
static void printIfPri(){
//cout<<"haha"<<endl;
}
};
template<intM>
structpirntIfPrimer<M,true>{
static void printIfPri(){
cout<<M<<endl;
}
};
int main()
{
printPrimer<3,90>::printPri();
return 0;
}