この質問では、素数を判断するシンプルな関数を実現し、この関数を使用してゴールドバッハの推測を検証する必要があります。6以上の偶数は、2つの奇数の素数の合計として表すことができます。素数は、1とそれ自体でのみ割り切れる正の整数です。注:1は素数ではなく、2は素数です。
関数インターフェイスの定義:
int prime( int p );
void Goldbach( int n );
関数は、入力prime
パラメーターp
が素数の場合は1を返し、それ以外の場合は0を返します。関数は、Goldbach
「n
= p + q」形式で出力n
される素数に従って分解されます。ここで、p≤qは素数です。また、そのような分解は一意ではないため(たとえば、24は5 + 19に分解できる、または7 + 17に分解できる)、すべての解の中で最小のpを持つ解を出力する必要があります。
審判員のテスト手順の例:
#include <stdio.h>
#include <math.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
/* 你的代码将被嵌在这里 */
入力サンプル:
89 100
出力例:
89 is a prime number
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97,
int prime(int p)//それが素数かどうかを判断する
{ int i; if(p == 1) return 0; if(p == 2) return 1; for(i = 2; i <p; i ++)//このループを使用して、それが素数かどうかを判断します { if(p%i == 0) return 0; } return 1; } void Goldbach(int n){ int i、j、flag = 0; for(i = 2; i <n ; i ++) { if(prime(i))//それが素数かどうかを判断する { for(j = 3; j <n; j + = 2) { if(n == i + j)// i + jかどうかを判断し、 nに等しい { if(prime(i)&& prime(j))//等しい場合は、さらに、それが素数かどうかを判断します { printf( "%d =%d +%d"、n、i、j);
flag = 1;
break;
}
else // i + jがnと等しくない場合、プログラムは直接次のループに入ります
continue;
}
}
}
if(flag)
break;
}
return;
}
注:1.問題がある場合は指摘してください、ありがとうございます!!!
2.より良いアイデアがある場合は、メッセージを残してください