【华为OJ】寻找等差数列

今天看来华为在机试啊,一直刷不出成绩,在本地编译器通过了,先记录下吧~

输入:m n

输出:[m,n]区间内的包含最多素数的等差数列

#include<iostream>  
#include<algorithm>
#include<vector>
#include<map>
using namespace std;

bool isPrime(int a)
{
	if (a == 2)return 1;
	else if (a > 2)
	{
		for (int i = 2;i < a;i++)
		{
			if (a%i == 0)return 0;
		}
		return 1;
	}
	else
		return 0;
}

struct find_diff
{
	int count;
	vector<int>vec;
};

bool cmp(find_diff a, find_diff b)
{
	return a.count > b.count;
}
int main()
{
	int m, n,j=0;
	int prime[1000];
	int num = 0;
	cin >> m >> n;
	find_diff fd[1000];
	
	for (int i = m;i <= n;i++)
	{
		if (isPrime(i))
		{
			prime[j++] = i;//cout << i << endl;
		}
	}
	for (int i = 0;i < 1000;i++)
		fd[i].count = 0;
	if (j > 1)
	{
		int diffmin = prime[1] - prime[0];
		int diffmax = prime[j - 1] - prime[0];
		for (int i = 0;i < j / 2 ;i++)
			for (int k = i + 1;k < j / 2+1 ;k++)
			{
				int diff = prime[k] - prime[i];
				for (int ff = 0;ff*diff <= diffmax;ff++)
				{
					int diffa = ff*diff;
					if (isPrime(prime[i] + diffa))
					{					
						fd[num].count++;
						fd[num].vec.push_back(prime[i] + diffa);
					}
					
					else break;
				}
				num++;
			}
		sort(fd,fd+1000,cmp);
		vector<int>::iterator p;
		for (p = fd[0].vec.begin();p != fd[0].vec.end();p++)
			cout << *p << ' ';

	}
	else cout << j;
	
	return 0;

}

思路是比较容易形成的,先做个质数判断函数,然后找出[m,n]内所有质数,然后两两取差值d,然后累加d判断是不是质数;

测试了一小时 ,汗颜!存储下一个等差数列的判断上出错了,把num++放到了最里面一层的else语句里,结果总是会捎到下一个数列,总算通过了,撒花~

OJ的初级题还有三题就刷完了!加油!

补充补充,OJ通过不了啊,我已经完善过代码了,还是无法AC,放一下改过的代码,有能看出错误的,走过路过帮忙指个

#include<iostream>  
#include<algorithm>
#include<vector>
#include<map>
using namespace std;

bool isPrime(int a)
{
	if (a == 2)return 1;
	else if (a > 2)
	{
		for (int i = 2;i < a;i++)
		{
			if (a%i == 0)return 0;
		}
		return 1;
	}
	else
		return 0;
}

struct find_diff
{
	int count;
	int different;
	vector<int>vec;
};

bool cmp1(find_diff a, find_diff b)
{
	return a.count > b.count;
}
bool cmp2(find_diff a, find_diff b)
{
	vector<int>::iterator p1 = a.vec.end();p1--;
	vector<int>::iterator p2 = b.vec.end();p2--;
	return *p1 > *p2;
}
bool cmp3(find_diff a, find_diff b)
{
	return a.different > b.different;
}
int main()
{
	int m, n,j=0;
	int prime[1000];
	int num = 0;
	cin >> m >> n;
	find_diff fd[1000];
	
	for (int i = m;i <= n;i++)
	{
		if (isPrime(i))
		{
			prime[j++] = i;//cout << i << endl;
		}
	}
	for (int i = 0;i < 1000;i++)
		fd[i].count = 0;
	if (j > 1)
	{
		
		int diffmax = prime[j - 1] - prime[0];
		for (int i = 0;i < j / 2 ;i++)
			for (int k = i + 1;k < j / 2+1 ;k++)
			{
				int diff = prime[k] - prime[i];
				fd[num].different = diff;
				for (int ff = 0;ff*diff <= diffmax;ff++)
				{
					int diffa = ff*diff;
					if (isPrime(prime[i] + diffa))
					{					
						fd[num].count++;
						fd[num].vec.push_back(prime[i] + diffa);
					}
					
					else break;
				}
				num++;
			}
		sort(fd,fd+1000,cmp1);
		
		int q = 0;
		for (int i = 1;i < 1000;i++)
		{
			if (fd[i].count == fd[0].count)
			{
				if (fd[i].different > fd[0].different)
				{
					find_diff a = fd[0];
					fd[0] = fd[i];
					fd[i] = a;
				}
				
			}
			else break;
		}
		//sort(fd, fd + q-1, cmp2);
		vector<int>::iterator p;
		
		for (p = fd[0].vec.begin();p != fd[0].vec.end();p++)
			cout << *p << endl;

	}
	else cout << j;
	
	return 0;

}


晕,我又来补充更新了,中级里面也有这道题目,我的第一版代码AC了,欣慰!中级里面就是要找同样元素个数的数列中首相最小的。这里应该是因为sort函数排序本身的特性决定的,也算运气,改天整理一下sort的具体算法,不同的容器map、set这些的排序与它的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值