アルゴリズムコンテスト入門経典双子素数


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
",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
",i,i+2); break; } return 0; }
プログラムはassert.を使用する.hのassertマクロは不正な関数呼び出しを制限し、x>=0が成立しない場合、プログラムは異常に終了する.
ASSERT
構文:
   #include   void assert( int exp );
機能:マクロassert()はエラー検出に使用されます.式の結果がゼロの場合、マクロはstdERRにエラーメッセージを書き込み、プログラム実行を終了します.マクロNDEBUGが定義されている場合、マクロassert()は無視されます.
関連トピック: