昨天一初学C语言的同学在做练习题的时候遇到了如题所示的题目,她从3开始求出了一定范围内所有素数存到数组中,再从数组中检索距离某数最近的数。当时我便告诉她说,这种方法的代价太大,并且只能在一定范围中进行工作。然后给她敲了一个从目标数开始双向寻找的程序,如下。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(void)
{
int aim;
int logo1=0,logo2=0;
int i,j;
scanf("%d",&aim);
if(aim<=2)
{
printf("3");
return 0;
}
if(aim==3)
{
printf("5");
return 0;
}
for(i=1;i<aim-2;i++)
{
for(j=2;j<=sqrt(aim+i);j++)
if((aim+i)%j==0)
break;
if(j>sqrt(aim+i))
logo1=1;
for(j=2;j<=sqrt(aim-i);j++)
if((aim-i)%j==0)
break;
if(j>sqrt(aim-i))
logo2=1;
if(logo1==1||logo2==1)
break;
}
if(logo1==1)
printf("%10d",aim+i);
if(logo2==1)
printf("%10d",aim-i);
return 0;
}
也就是双向寻找,当遇到素数时做标记并跳出循环输出。(大神勿喷= =、)
今天打开电脑又想到同学的那个程序,仔细想想,其实他的那种方法还是有可圈可点的地方的。比如说2014年深圳杯数学建模竞赛的B题(一道有关生物基因工程的题,有兴趣的可以去看看) 就是这样。它需要先将所有DNA序列测出存储,然后在实际研究过程中进行索引。这两者之间有些类似。但是这种方法还要结合后台数据库去实现,毕竟单纯C语言是不能进行长期存储的,它需要每次使用前都进行存储,这样就会浪费很多时间。