每日刷题(二十)
蓝桥杯第八届C语言B组省赛习题
习题B:等差素数列
这题直接一点就用暴力枚举法
这里我写了两份上传代码,这些代码便于各位深入分析这个题目,也适合于那些一直没弄懂自己代码问题的朋友们借助我的代码调试从而发现自己问题
第一份C代码
#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
if(n == 3)
return 1;
for(i = 2; i <= sqrt(n); i++)
if(n % i == 0)
return 0;
return 1;
}
int main()
{
int i = 2, j, d, a[5000], num = 0, account = 0;
while(account < 5000)
{
if(isPrime(i))
{
a[num++] = i;
account++;
}
i++;
}
// for(i = 0; i < 5000; i++) //遍历所有的素数
// printf("%9d", a[i]);
// printf("\nNow!\n");
int flag = 1;
for(i = 0; i < 5000; i++)
{
if(flag == 0)
break;
for(j = 1; j <= 1000; j ++)
{
d = a[i] + j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d))
{
d += j;
if(isPrime(d)){
// printf("%d %d\n",a[i], j);
printf("%d",j);
flag = 0;
break;
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
}
return 0;
}
第二份代码新鲜出炉
#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
if(n == 3)
return 1;
for(i = 2; i <= sqrt(n); i++)
if(n % i == 0)
return 0;
}
int main()
{
int i = 2, a[5000], num = 0, account = 0;
while(account < 5000) //得到一个素数数组
{
if(isPrime(i))
{
a[num++] = i;
account++;
}
i++;
}
// for(i = 0; i < 5000; i++) //遍历素数数列
// printf("%9d", a[i]);
//
// printf("\nNow!\n");
//
int j, d = 0, k;
for(i = 0; i < 5000; i++)
{
for(j = 1; j < 1000; j++)
{
d = a[i];
num = 1;
for(k = 0; k < 9; k++)
{
d += j;
if(isPrime(d))
{
num++;
}
else
break;
}
if(num == 10)
{
printf("%d",j);
break;
}
}
}
return 0;
}
官方给的代码:
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
typedef long long LL;
set<int>all;
bool isPrime(LL t){ //判断素数的函数
for(int i = 2; i < sqrt(t); ++i){
if(t % i == 0)
return false;
}
return true;
}
int f(LL a[], int n){
for(int i = 0; i < n; ++i){
LL first = a[i];
for(int delta = 1; delta < a[n - 1] - first; delta++){
int m = first;
for(int j = 1; j < 10; ++j){
m += delta;
if(all.find(m) == all.end()) //m不是素数
break;
if(m > a[n - 1])
break;
if(j == 9)
return delta;
}
}
}
return -1;
}
const int N = 5000;
LL a[N];
int main()
{
all.insert(2);
all.insert(3);
int index = 2;
LL t = 5;
while(index < N){
if(isPrime(t)){
a[index++] = t;
all.insert(t);
}
t++;
}
cout << f(a, N) << endl;
return 0;
}
通过这个测试代码经过对比可得210是最终答案
#include<stdio.h>
#include<math.h>
int isPrime(int n)
{
int i;
if(n == 3)
return 1;
for(i = 2; i <= sqrt(n); i++)
if(n % i == 0)
return 0;
return 1;
}
int main()
{
int i = 2, j, d, a[5000], num = 0, account = 0;
while(account < 5000)
{
if(isPrime(i))
{
a[num++] = i;
account++;
}
i++;
}
// for(i = 0; i < 5000; i++)
// printf("%9d", a[i]);
// printf("\nNow!\n");
int flag = 1;
for(i = 0; i < 5000; i++) //µÚÒ»¸ö
{
if(flag == 0)
break;
for(j = 1; j <= 10000; j ++)
{
d = a[i] + j; //µÚ¶þ¸ö
if(isPrime(d))
{
d += j; //µÚÈý¸ö
if(isPrime(d))
{
d += j; //µÚËĸö
if(isPrime(d))
{
d += j; //µÚÎå¸ö
if(isPrime(d))
{
d += j; //µÚÁù¸ö
if(isPrime(d))
{
d += j; //µÚÆ߸ö
if(isPrime(d))
{
d += j; //µÚ°Ë¸ö
if(isPrime(d))
{
d += j; //µÚ¾Å¸ö
if(isPrime(d))
{
d += j; //µÚÊ®¸ö
if(isPrime(d))
printf("%d %d\n",a[i], j);
// {
// printf("%d",j);
// flag = 0;
// break;
// }
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
else
{
d = 0;
continue;
}
}
}
}
结果如下
所以最小公差就是210