算法竞赛入门经典 孪生素数

如果n和n+2都是素数,则称他们是孪生素数。输入m,输出连个数均不超过m的最大孪生素数。5<=m<=10000.例如m=20时的答案是17、19,m=1000时的答案是881、883.

//孪生素数
#include<stdio.h>
//判断x是不是素数的函数 
 int is_prime(int x){
 	int i;
 	for(i=2;i*i<=x;i++)
 	if(x%i==0)return 0;
 	return 1;
}

int main(){
	int i,m;
	scanf("%d",&m);
	for(i=m-2;i>=3;i--)
	if(is_prime(i) && is_prime(i+2))
	{
		printf("%d %d\n",i,i+2);
		break;
	}
	return 0;
} 

注意:对于一个功能如果需要重复利用,可以定义一个函数。


//孪生素数
#include<stdio.h>
#include<math.h>
#include<assert.h> 
//判断x是不是素数的函数 
 int is_prime(int x){
 	int i,m;
 	assert(x>=0);
 	if(x==1) return 0;
 	m=floor(sqrt(x)+0.5);//避免浮点误差 
 	for(i=2;i<=m;i++)
 	if(x%i==0)return 0;
 	return 1;
}

int main(){
	int i,m;
	scanf("%d",&m);
	for(i=m-2;i>=3;i--)
	if(is_prime(i) && is_prime(i+2))
	{
		printf("%d %d\n",i,i+2);
		break;
	}
	return 0;
} 
程序使用了assert.h中的assert宏来限制非法的函数调用,当x>=0不成立时,程序将异常终止。


ASSERT

语法:

   #include <assert.h>  void assert( int exp );
功能: 宏assert()用于错误检测。如果表达式的结果为零,宏写错误信息到STDERR并退出程序执行。如果宏NDEBUG已经定义,宏assert()将被忽略。

相关主题:



你可能感兴趣的:(c,算法)