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

本文介绍了一种有效的素数判定算法,通过预处理的方式快速判断一个数是否为素数,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值