大家好,我是2019年北航考研的考生,在3月18号参加了北航的机考,特此在这个 根据自己的回忆给出题目描述,一个测试用例,样例输出,以及本人编写的参考代码,以及思路讲解。如果我可以得到题目的原本描述,会更新给大家的。
还有做几点说明,北航上机考试建议使用标准c编程,解释一下标准c编程,不能使用基于特定平台的库,例如windows.h,linux系统下的特定库,某个厂家自己开发出的库,这些都是编译不通过的。其他的库都是可以使用的。还有可以使用标准c++编程,可以使用STL(例如vector,set,queue,stack,map等等),可以使用<algorithm>库(例如sort()函数),可以使用c++的语言特性,例如重载,动态联编等等。(这个想说,有些学长学姐可能会说不能使用c++,特此声明,完全可以,像今年和去年的第二道题目,都比较难,涉及三叉树,用c++的库会方便不少)。
题目一:给定闭区间[a,b] ,要求输出 素数的等差序列,三个以上才算是序列,例如 [100,200] 会输出 151 157 163 和167 173 179
再例如输入[1,100] 会有两个等差序列,3 5 7 和47 53 59。输出样式行末的空格保留。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int isPrime(int n)
{
if(n==1) return 0;
else if(n<5) return n<4;
else
{
if(n%6!=5&&n%6!=1) return 0;
int len = sqrt(n);
for(int i=2; i<=len+1; i++)
if(n%i==0) return 0;
return 1;
}
}
int getNextPrime(int n)
{
while(1)
{
if(isPrime(n+1)) return n+1;
else n++;
}
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int first,second,tmp,dif;
int x = a-1;
while(x<=b)
{
first = getNextPrime(x);
x = first;
if(x>b) break;
second = getNextPrime(x);
x = second;
if(x>b) break;
dif = second - first;
tmp = getNextPrime(x);
x = tmp;
if(x>b) break;
if(tmp-second==dif)
{
printf("%d %d %d ",first,second,tmp);
int tmp2 = second;
while(tmp-tmp2==dif)
{
tmp2 = tmp;
tmp = getNextPrime(x);
x = tmp;
if(x>b) break;
if(tmp-tmp2==dif) printf("%d ",tmp);
else x = tmp2;
}
printf("\n");
}else{
x = first;
}
}
}
样例输入:141 400
样例输出:151 157 163
167 173 179
199 211 223
251 257 263 269
367 373 379
题目解析:比较中规中矩的算法题,第一点是判断素数的函数,第二点是就是如何控制满足题目描述,并且输出正确的格式,我觉得唯一注意的问题就是注意判断1不是素数。