今天看来华为在机试啊,一直刷不出成绩,在本地编译器通过了,先记录下吧~
输入: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这些的排序与它的区别。