C语言(C班)E题题解:
注意:此题可省略比较大小的操作,因为一个数分成两个数,这两个数的差越小,乘积就越大,所以只需从n/2处开始判断,遇到第一个符合条件的数直接输出即可。
#include <stdio.h>
#include <math.h>
int isprime(int x)//判断质数基本算法
{
int i;
if(x==2) return 1;
for(i=3; i<(int)(sqrt(x)+1); i+=2)
if(x%i==0) return 0;
return 1;
}
int main()
{
int n, a, b;
while(scanf("%d",&n)!=EOF)
{
int i=n/2;
if(i%2==0) i--;//从奇数开始,可以避免判断偶数(n大于4,不可能存在偶数答案)
for(i; i>1; i-=2)//循环步长为2
if(isprime(i) && isprime(n-i)) break;//遇到符合条件的数直接跳出循环
printf("%d %d\n",i,n-i);
}
return 0;
}
用这种调用函数暴力尝试2~sqrt(p)的方法判断p是否为素数固然是简单明了,但是时间复杂度较高,而且再次询问需重新计算,在这个问题中可能存在大量重复,比如n=100判断过49是否为素数,假设后面有一个例子是n=102,则又一次需要判断49是不是素数(好在数据范围比较小,不会超时)。一个可以的解决方案是先用筛法生成一张素数表,然后对素数的判断直接查表获得。素数表可以是一个bool类型的数组primes,通过使用primes[p]来判断是否为素数。