寻找素数

教学方法:

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;
}

参考:http://coolshell.cn/articles/3738.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值