2019-2-1

第一次编写

/*
第一次编写
2020/3/3
*/
#include<stdio.h>
#include<math.h>

int tmp[3];
int ans[1000000];
int first;
int flag;
int a,b;

int  isPrime(int t)
{
	int i;
	if(t == 0 || t == 1)
		return 0;
	for(i = 2;i<=(int)sqrt(t);i++)
	{
		if(t % i == 0)
			return 0;
	}
	return t;
}

int main()
{
	int i,j,k;
	int d;
	int n;
	n = 0;
	scanf("%d%d",&a,&b);
	for(i = a;i<=b;i++)
	{
		if(isPrime(i)){
			//printf("%d ",i);
			ans[n++] = i;
		}
	}
	d = (a+b)/2 + 1;

	for(i = 1;i<=d;i++)//等差d
	{
		for(j = 0;j<n;j++)//元素
		{
			if( ans[j] == ans[j+1] - i && ans[j+1] == ans[j+2]-i)
			{
				printf("%d %d %d ",ans[j],ans[j+1],ans[j+2]);
				j = j+2;
				while(ans[j]==ans[j+1] - d)
				{
					printf("%d ",ans[j+1]);
					j++;
				}
				printf("\n");
			}
		}
	}
	return 0;
}
/*
IN:
140 400
OUT:
151 157 163
167 173 179
251 257 263 269
367 373 379
199 211 223
*/
  • 注:
for(i = 1;i<=d;i++)//等差d
	for(j = 0;j<n;j++)//元素
//得出的答案是按照等差数列的d排序
151 157 163
167 173 179
251 257 263 269
367 373 379
199 211 223


for(j = 0;j < n;j++)//元素
	for(i = 1;i<=d;i++)//等差d
//得出的答案是按照等差数列的第一个元素的大小排序
151 157 163
167 173 179
199 211 223
251 257 263 269
367 373 379

第二次编写

发现一些问题:
这样的写法只能够求解出相邻素数的等差数列{3,5,7},是否存在不相邻素数的等差数列(中间隔着其他元素)????
举个栗子:元素并不是都是素数,如{1,7,3,6,5,10}:
按照这种写法得不到{1,3,5}是等差数列
可能题目就是这个意思吧。。。

/*
第二次编写
2020/4/11
*/
#include<stdio.h>
#include<math.h>
#include<string.h>


int primeArr[1000];

int isPrime(int n)
{
	if(n == 0 || n == 1) return 0;
	for(int i = 2;i<=(int)sqrt(n);i++)
	{
		if(n%i == 0)
			return 0;
	}
	return 1;
}


int main()
{
	int i;
	int a,b;
	scanf("%d%d",&a,&b);
	
	memset(primeArr,0,sizeof(primeArr));

	int n = 0;
	for(i = a;i<=b;i++)
	{
		if(isPrime(i))
		{
			primeArr[n++] = i;
		}
	}

	int ii,temp_d;
	int count;
	
	for(i = 0;i<n; )//将i的判断放在后面
	{
		ii = i;
		temp_d = primeArr[ii+1] - primeArr[i];//不是采用枚举法
		count = 1;
		while( primeArr[ii] + temp_d == primeArr[ii + 1] )//不必担心primeArr越界
		{
			count++;
			ii++;
		}

		if(count>=3)
		{
			int j;
			for(j = 0;j<count;j++)
			{
				if(j == count - 1)
					printf("%d\n",primeArr[ii - count + j + 1]);
				else
					printf("%d ",primeArr[ii - count + j + 1]);
			}
			i = ii - 1;
		}
		else
		{
			i++;
		}
	}

	return 0;
}
//相比于第一次时间复杂度降低很多,不是采用枚举法获得等差
/*
IN:
140 400
OUT:
151 157 163
167 173 179
199 211 223
251 257 263 269
367 373 379
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值