goj 天涯若比邻(最小与最大相邻素数)

Problem Description:

一心想搞ACM的小G最近迷上了数论,特别对于跟“素数”相关的问题特别有感觉。今天,突发奇想的他给自己出了个难题,随便给出一个int32位范围内的正整数,能否知道它相邻的素数呢?

Input:

输入数据有多组,每组包含int32位范围内的正整数 n 和 f。其中,"f=1"表示要求出比 n 大的相邻素数,"f=-1"表示要求出比 n 小的相邻素数。如果输入n,f都等于0,则表示输入结束,该组数据不做处理。

Output:

对于每组测试数据,输出为一行,且格式为“Case #x: y”,x从1开始,y为对应的答案。

Sample Input:

2 1
7 1
0 0

Sample Output:

Case #1: 3
Case #2: 11
解题思路:题目很简单,但要注意的是当输入的值为2147483647即为int的最大值,且f==1时,此时向上枚举会溢出,所以要定义成long long,为了不发生类型转换造成错误,因此统一定义成long long型。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 bool isprime(LL x){ //判断素数
 5     for(LL i=2;i*i<=x;++i)
 6         if(x%i==0)return false;
 7     return true;
 8 }
 9 int main()
10 {
11     int f,g=0;
12     LL n,r;//将n定义为longlong,以免int隐式转化成longlong发生错误,r保存相邻的素数
13     while(cin>>n>>f && (n+f)){
14         if(f==1){
15             for(LL i=n+1;;++i)//大于n进行枚举,直到找到第一个素数为止
16                 if(isprime(i)){r=i;break;}
17         }
18         else{
19             for(LL i=n-1;i>1;--i){//小于n进行枚举,直到找到第一个素数为止
20                 if(isprime(i)){r=i;break;}
21             }
22         }
23         cout<<"Case #"<<(++g)<<": "<<r<<endl;
24     }
25     return 0;
26 }
原文地址:https://www.cnblogs.com/acgoto/p/8995407.html