描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足4≤n≤1000
输入描述:
输入一个大于2的偶数
输出描述:
从小到大输出两个素数
解题过程
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
思路是:建立一个数组,存放2~n中的素数。除了2之外都是奇数,所以长度定为500;
过程中出现问题:
这里出现了错误。
解决方法:把第八行中for循环的最后一个部分删去"k++":
这样就顺眼多了:
提交代码
#include <stdio.h>
int main() {
int str[500];//用于存放素数,素数必然是质数
int n,n1,n2,i,j,k,count=0,min;
scanf("%d", &n);
str[0]=2;str[1]=3;
for(i=5,k=2;k<500;i=i+2)//k为数组的下标,在本循环中,质数i从5开始
//创建一个质数数组
{
count=0;
for(j=2;j<i/2;j++)//i是判断是否为质数的数,j是因数
{
if(i%j==0)count++;
}
if(!count)
{
str[k]=i;//如果...那么为质数
k++;
}
}
min=n;
for(i=0;i<500;i++)
{
for(j=i;j<500;j++)
{
if(!(str[i]+str[j]-n)&&(str[j]-str[i])<min)
{
min=str[j]-str[i];
n1=str[i];n2=str[j];
}
}
}
printf("%d\n%d",n1,n2);
return 0;
}
学习代码
(来源:https://blog.nowcoder.net/n/9034fe67c4984ccaa8507d8bc04e5ce1)
思想是一样的,但他的更简便一些
#include<stdio.h>
int fac(int a){
for(int i=2;i<=a/2;i++)
if(a%i==0)
return 0;
return 1;
}
int main(){
int n;
while(~scanf("%d",&n)){
int max=2,i=2,another=n-i;
while(i<=another){
if(fac(i)&&fac(another))max=i;
i++;
another--;
}
printf("%d\n%d\n",max,n-max);
}
}