素数槽csuoj

超时代码:

#include <iostream>

using namespace std;
//写一个函数判断是否是素数
bool isPrime(int num)
{int i=2;//cout<<"OK2";
for(;i*i<=num;i++){
if(num%i==0)break;
}
if(i*i>num)return true;
else return false;
}

int main()
{

int T;
cin>>T;

for(int j = 1;j <= T; j++){
int aim;
cin>>aim;

int count = 2;

if(isPrime(aim)){

cout<<0<<endl;
}
else{
for(int i = aim-1;;i--){if(isPrime(i))break;
else count++;}
for(int i = aim+1;;i++){if(isPrime(i))break;
else count++;}

cout<<count<<endl;
}
}
return 0;
}

超时原因是因为每次都单独去判断是否是素数,最后就在有大量素数时没法处理了

然后通过建立一个很大的bool型数组的方式将问题解决了

AC代码:

#include <iostream>

using namespace std;

bool * zhangjie=new bool [1299710];//首先是申请和分配空间的一个操作

int main()
{
for(int p=1;p<=1299710;p++){
zhangjie[p]=true;
}//这是进行初始化的一个操作

for(int i=2;i<1299710;i=i+1)
{
if(zhangjie[i]){
for(int j=i+i;j<=1299710;j=j+i)
zhangjie[j]=false;
}
}
int T;
cin>>T;

for(int j = 1;j <= T; j++){
int aim;
cin>>aim;

int count = 2;

if(zhangjie[aim]){

cout<<0<<endl;
}
else{
for(int i = aim-1;;i--){if(zhangjie[i])break;
else count++;}
for(int i = aim+1;;i++){if(zhangjie[i])break;
else count++;}

cout<<count<<endl;
}
}
return 0;
}

素数槽csuoj

时间: 2024-08-11 03:30:31

素数槽csuoj的相关文章

CSU1030素数槽

Description 处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽.例如,‹24, 25, 26, 27, 28›是处于素数23和素数29之间的一个长度为6的素数槽. 你的任务就是写一个程序来计算包含整数k的素数槽的长度.如果k本身就是素数,那么认为包含k的素数槽的长度为0. Input 第一行是一个数字n,表示需要测试的数据的个数.后面有n行,每行是一个正整数k, k大于1并且小于或等于的第十万个素数(也就是1299709). Outp

csu 1030: 素数槽

 素数槽 Description 处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽.比如,?24, 25, 26, 27, 28?是处于素数23和素数29之间的一个长度为6的素数槽. 你的任务就是写一个程序来计算包括整数k的素数槽的长度.假设k本身就是素数,那么觉得包括k的素数槽的长度为0. Input 第一行是一个数字n,表示须要測试的数据的个数.后面有n行,每行是一个正整数k.k大于1而且小于或等于的第十万个素数(也就是1299709)

Ruby、PHP与SHELL中求50之内的素数方法

求50之内的素数,ruby的代码如下: #encoding:utf-8 #求50以内的素数(注意数字中..与...的区别) for i in 2..50     f=true #起始假定每个数都是素数     for p in 2...i #比自身小的正整数(1和自身除外) if i%p==0 #如果能整除 f=!f #那么这个数不是素数 break #并且跳出这层循环         end # if 结束     end #内层循环结束     print i," " if f #

177. 有限制的素数

177. [USACO Jan07] 有限制的素数 ★   输入文件:qprime.in   输出文件:qprime.out   简单对比 时间限制:1 s   内存限制:128 MB Farmer John 开始给奶牛们标记上素数的牌子,贝茜注意到了这一切,她对各种数的牌子很好奇. 请帮助贝茜算出从A到B (1 ≤ A ≤ B ≤ 4,000,000; B ≤ A + 1,000,000; B ≤ A + 2,000,000 ),其中包含数字D的素数的个数. 素数是只有两个两个约数(1 和 它

素数应用

输入一个数 分解尾三个数想乘 如果三个数其中有两个为素数->yes 否则no 1 //素数升级 2 //功能:??已知N是正整数,?它可拆写成三个正整数N1.N2和N3之和的形式N=N1+N2+N3.? 3 //请编程序打印出满足上式的全部组合,并当N1.N2和N3中至少有两个是素数时打印"YES"否则打印"NO".? 4 //如N = 5时输出:? 5 //5 = 1 + 1 + 3?????NO? 6 //5 = 1 + 2 + 2?????YES? 7

尝试用filter()函数删除1~100的素数

题目来自"廖雪峰的官方网站--Python教程",尝试用filter()函数删除1~100的素数: def is_prime(n):     if n <= 1:         return False     for s in range(2,n):         if n % s == 0:             return False     return True      print filter(is_prime,range(1,101) 素数的定义: 质数(

今天练习了一下用python写函数,就把它记录到博客上吧 冒泡排序和素数判断

第一个是判断素数,先上代码吧: 1 from math import sqrt 2 def is_prime(i): 3 if i == 2: 4 return True 5 elif i<2: 6 return False 7 elif i%2 == 0: 8 return False 9 else: 10 for n in range(3,int(sqrt(i)+1),2): 11 if i%n == 0: 12 return False 13 return True 这里用到了math包的

hdu 2136 筛法求素数以及一些细节上hxy做的优化

题目大意:每个数字都可以表示为一些素数的和,原因很显然:由算数基本定理可知,每一个数都可以表示为素数的乘积,自然也就可以表示为一些素数的和咯. 于是题目让我们求在这样的表示中出现的最大的素数是第几个素数. 思路:一开始想都没想,上了一个这样的代码. 1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 1000000

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1<=L< R<=2,147,483,647) R-L <=1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因为R和L都是满int的,中间有很多细节处理会爆int的,还要注意1不是素数,所以在区间筛中要特判一下,是个易错的地方 //1160K 16MS C++ 1539B #include<cstdio> #include<ios