演習6-5関数を使用してゴールドバッハの予想を検証する(20ポイント)

この質問では、素数を判断するための単純な関数を実現し、この関数を使用してゴールドバッハの予想を検証する必要があります。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 )
{
    
     //参数p为素数时返回1,否则返回0
	int i;
	int flag = 1;
	for (i = 2; i <= sqrt(p); i++)  //详情见下面 
	{
    
    
		if (p % i == 0)
		{
    
    
			flag = 0;
			break;
		}
	}
	if (flag == 1 && p != 1) return 1;  //注意这里需要加一个条件 p 不等于 1 ,因为 1 不是素数 
	else return 0;
}
void Goldbach( int n )
{
    
     //按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数.要求必须输出所有解中p最小的解
	int i; //循环变量 
	int j = 3; //分解的第一个素数 ,初值为 3 ,因为题目要求分解的数必须是素数 
	int flag = 1; //中介,用于判断是否是素数 
	int temp1 = 0, temp2 = 0; //用于存放 n 分解出来的两个素数
	while ((temp1 + temp2) != n) //当temp1加temp2不等于n时循环 
	{
    
    
//		flag = 1; //中介赋值为1,默认我们所要判断的数是素数 
//		for (i = 2; i <= sqrt(j); i++) //判断素数 
//		{
    
    
//			if (j % i == 0)
//			{
    
    
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1) temp1 = j; //如果是素数,把第一个素数给 temp1 
		if (prime(j) == 1) temp1 = j;
		int t = n - temp1; //定义t变量,赋值为 n 减 temp1(因为其他的数,加起来不是没超过 n ,就是超过 n,减去就刚刚好) 例:87=90-3 
//		for (i = 2; i <= sqrt(t); i++) //判断第二个是不是素数 
//		{
    
    
//			if (t % i == 0)
//			{
    
    
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1) temp2 = t;
		if (prime(t) == 1) temp2 = t;
		j += 2; //每次 j 加二,因为初值为 3;题目要求分解出来的数是奇数的素数 
	}
	printf("%d=%d+%d", n, temp1, temp2); //如果两个素数都找出来了就打印 
} 

おすすめ

転載: blog.csdn.net/qq_44715943/article/details/114585552