内容会持续更新,有错误的地方欢迎指正,谢谢!
问题1
完美世界2017年笔试题:编写一个程序,将小于n的所有质数找出来。
分析
质数又名素数,取值:2 3 5 7 9 11等等
质数 对 小于自己的质数 求余,不等于0;且小于自己的质数 的范围在[2,sqat(i)]。
代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> res;
vector<int> CalP(int n)
{
if(n<2)
return res;
res.push_back(2);
int i,j;
for(i=3;i<=n;++i)
{
for(j=0;j<res.size()&&res[j]<=sqrt(i);++j)
{
if(i%res[j]==0)
break;
}
if(j==res.size()||res[j]>sqrt(i))
res.push_back(i);
}
return res;
}
问题2
腾讯2017年笔试题:给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数
输入例子:
10
输出例子:
2
分析
任何一个合数(非质数且非1且非0)都能由两个质数相加得到。
步骤:
- 先求1000以内的质数并保存在vector容器里。
- 假设输入的是sum,那么其中一个质数的取值范围[2,sum/2],另一个质数的取值范围[sum/2,sum-2]。或者,直接利用前后两个游标,不断向中间靠拢来遍历,便可求出最终的对数。
所用数据结构: vector
代码
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
//求1000以内的素数并保存
int i,j;
void GetPrime(vector<int>& primeNum)
{
primeNum.push_back(2);
for(i=3;i<1000;++i)
{
for(j=0;j<primeNum.size()&&primeNum[j]<=sqrt(i);++j)
{
if(i%j==0)
break;
}
if(isPrime)
primeNum.push_back(i);
if(j==primeNum.size()||primeNum[j]>sqrt(i))
primeNum.push_back(i);
}
}
//根据sum和primeNum,求满足条件的对数
int PrimePair(int sum)
{
vector<int> primeNum;
GetPrime(primeNum);
int resCount=0;
/*常规方法
int midVal=0;
for(i=0;primeNum[i]<=sum/2;++i)
{
midVal=i;
}
for(i=0;primeNum[i]<=sum/2;++i)
{
for(j=midVal;primeNum[j]<=sum-2;++j)
{
if(primeNum[j]+primeNum[i]==sum)
++resCount;
}
}
return resCount;
*/
//另一种方法:用游标。练练手,快忘记游标了。。。
vector<int>::iterator leftIter = primeNum.begin();
vector<int>::iterator rightIter = primeNum.end()-1;
while(leftIter<=rightIter)
{
if((*leftIter+*rightIter)==sum)
{
++resCount;
++leftIter;
--rightIter;
}
else if((*leftIter+*rightIter)>sum)
--rightIter;
else
++leftIter;
}
return resCount;
}
int main()
{
int sum=0;
while(cin>>sum)
{
if(sum<=3||sum>=1000)
{
cout<<0<<endl;
continue;
}
cout<<PrimePair(sum)<<endl;
}
return 0;
}