南阳OJ-语言入门_169_素数




素数

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 1
描述

走进世博园某信息通信馆,参观者将获得前所未有的尖端互动体验,一场充满创想和喜悦的信息通信互动体验秀将以全新形式呈现,从观众踏入展馆的第一步起,就将与手持终端密不可分,人类未来梦想的惊喜从参观者的掌上展开。

在等候区的梦想花园中,参观者便开始了他们奇妙的体验之旅,等待中的游客可利用手机等终端参与互动小游戏,与梦想剧场内的虚拟人物Kr. Kong 进行猜数比赛。当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将会获得一个意想不到的礼物。

例如:当屏幕出现22时,你的回答应是23;当屏幕出现8时,你的回答应是7;若X本身是素数,则回答X;若最接近X的素数有两个时,则回答大于它的素数。

 

输入
第一行:N 要竞猜的整数个数
接下来有N行,每行有一个正整数X
1<=N<=5 1<=X<=1000
输出
输出有N行,每行是对应X的最接近它的素数
样例输入
4
22
5
18
8
样例输出
23
5
19
7


#include<stdio.h>
#include<math.h>

const int TRUE = 1;  
const int FALSE = 0; 

int main( void )
{
	int isPri( int n );//判断 n 是否为素数  
 
	int N = 0;
	int n = 0;
	int m = 0;
	int l = 0;//左边的素数
	int r = 0;//右边的素数
	scanf("%d",&N);
	
	while( N-- )
	{
		scanf("%d",&n);
		
		m = n;
		
		if( isPri( n ) )//如果n是素数,则输出
		{
			printf("%d",n);
		}
		else 
		{
			for( n = n - 1; n >= 2; n-- )//求左边的素数
			{
				l = n;
				if( isPri( l ) )
				{
					break;
				}
			}
			
			n = m;
			
			for( n = n + 1; ; n++ )//求右边的素数
			{
				r = n;
				
				if( isPri( r ) )
				{
					break;
				}
			}
			
			n = m;
			
			//printf("l = %d\tr = %d\n",l,r);
			
			if( ( n - l ) == ( r - n ) )//如果距离相等,则输出右边的素数
			{
				printf("%d",r);
			}
			else if( ( n - l ) < ( r - n ) )//如果最接近左边,则输出左边的素数
			{
				printf("%d",l);
			}
			else if( ( n - l ) > ( r - n ) )//如果最接近右边,则输出右边的素数
			{
				printf("%d",r);
			}
		}
		
		printf("\n");
		
		
	}
	//printf("\n\nHello World!\n");
	return 0;
}


//判断 n 是否为素数  
int isPri( int n )  
{  
    if( 2 > n )  
    {  
        return FALSE;  
    }  
    int i;  
    int t = sqrt( n );  
    int blog = TRUE;  
  
    for( i = 2; i <= t; i++ )  
    {  
        if( 0 == n % i )  
            {  
                    blog = FALSE;  
                    break;  
            }  
    }  
  
    return blog;  
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值