题目1047:素数判定(不用除法和求余)

题目1047:素数判定
时间限制:1 秒 内存限制:32 兆 特殊判题:否  提交:4800 解决:2241
题目描述:
给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。
输入:
测试数据有多组,每组输入一个数n。
输出:
对于每组输入,若是素数则输出yes,否则输入no。
样例输入:
13
样例输出:
yes
来源:
2009年哈尔滨工业大学计算机研究生机试真题

 

      
      
#include <iostream>
#include <cmath>
using namespace std ;
#define MAX 10000000
bool is_prime [ MAX ];
void f_prime (){
//素数。指在一个大于1的自然数中,除了1和此整数自身外,没有其他因数。
//最小的三个素数是 2 3 5
//若程序超时 可适当调整MAX
int tmp = sqrt ( MAX );
for ( int i = 2 ; i < MAX ; i ++ )
is_prime [ i ] = true ;
//初始化
for ( int i = 2 ; i < MAX ; i ++ ){
if ( is_prime [ i ] == false )
continue ;
if ( i >= tmp ) ///当i比较大时,i*i可能会溢出
return ;
for ( int j = i * i ; j < MAX ; j += i )
//直接从i*i考虑即可,如i=7,49-1=48 已由i=2时处理过
is_prime [ j ] = false ;
}
}
int main ( )
{
int n ;
f_prime (); //相当于预处理咯
while ( cin >> n ){
if ( n <= 1 )
cout << "no \n " ;
else {
if ( is_prime [ n ])
cout << "yes \n " ;
else
cout << "no \n " ;
}
}
return 0 ;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值