列表

详情


HJ60. 查找组成一个偶数最接近的两个素数

描述

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。

数据范围:输入的数据满足

输入描述

输入一个大于2的偶数

输出描述

从小到大输出两个素数

示例1

输入:

20

输出:

7
13

示例2

输入:

4

输出:

2
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 264KB, 提交时间: 2020-12-09

#include <stdio.h>
int main(void)
{
	char flag;
	int i, j, k, num;
	for( ; scanf("%d", &num)!=EOF; ){
		i=num>>1;
		flag=1;
		for(j=2; j*j<=i; j++)
			if(i%j==0){ flag=0; break; }
		if(flag){
			if(i%2) { printf("%d\n%d\n", i, i); continue; }
			if(i==2) { printf("2\n2\n"); continue; }
		}
		for(i--; i>=2; i--){
			flag=1;
			for(j=2; j*j<=i; j++)
				if(i%j==0){ flag=0; break; }
			if(flag){
				k=num-i;
				for(j=2; j*j<=k; j++)
					if(k%j==0){ flag=0; break; }
				if(flag){
					printf("%d\n%d\n", i, k);
					break;
				}
			}
		}
	}
	return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 332KB, 提交时间: 2021-09-09

#include <stdio.h>

int isSuNumber(int x)
{
    for(int i = 2; i * i <= x; i++)
    {
        if(x % i == 0)
            return 0;
    }
    
    return 1;
}

int main ()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int a = 2;
        int b = n - a;
        int minDelt = 0;
        if(a > b)
            minDelt = a - b;
        else
            minDelt = b - a;
        for(int i = 3; i <= n/2; )
        {
            if(isSuNumber(i) && isSuNumber(n - i))
            {
                if(n - 2 * i < minDelt)
                {
                    minDelt = n - 2 * i;
                    a = i;
                    b = n - i;
                }
            }
            i += 2;
        }
        printf("%d\r\n%d\r\n", a, b);
    }
    
    return 0;
}

上一题