@Author:Pakzat
QQ:3369308571
题目
给了我们两个质数的和,求构成这个值的质数最大乘积,给的值不大于10000
要做这个程序我们要用到STL的vector
这道题是在B2128题的基础上做的,可以点击我先看看怎么求素数个数
求素数个数代码:
#include <bits/stdc++.h>
using namespace std;
bool tf(int s){
if (s<=1){
return false;
}
int q=sqrt(s);
for (int i=2;i<=q;i++){
if (s%i==0){
return false;
}
}
return true;
}
int main(){
int san;
int n=0;
cin>>san;
for (int j=2;j<=san;j++){
if (tf(j)){
// cout<<"素数";
n++;
}else{
// cout<<"不是素数";
}
}
cout<<n;
}
我们写好求素数个数的代码后稍加修改就可以
我们在函数外先写两个vector
#include <bits/stdc++.h>
using namespace std;
vector<int> sz;
vector<int> qk;
做一个判断素数程序,并且把素数放到vector里
bool san(int s){
if (s<=1) return false;
double m=sqrt(s);
for (int i=2;i<=m;i++){
if (s%i==0) return false;
}
sz.push_back(s);
return true;
}
然后现在写主函数
这个主函数中,当我们输入了书记后,调用判断函数求范围里的素数,并保存。
然后用嵌套循环把vector里的所有素数都相乘,并且保存到另一个vector里。
保存后会调用sort()函数把vector进行排序,因为vector是从小到大排的,而题目要求求最大的
所以为了不麻烦,用了reverse()函数进行反转,就变成了从大到小的排序,最后输出的第一个数据就是最大数据了。
int main(){
int b;
cin>>b;
for (int i=0;i<10000;i++){
san(i);
}
for (int i=0;i<=sz.size();i++){
for (int j=0;j<=sz.size();j++){
if(sz[i]+sz[j]==b){
qk.push_back(sz[i]*sz[j]);
// cout<<"###"<<sz[i]<<" "<<sz[j]<<endl;
}
}
}
sort(qk.begin(),qk.end());
reverse(qk.begin(),qk.end());
cout<<qk[0];
// for(int p:qk) cout<<p<<endl;
// cout<<endl<<sz.size()<<endl;
}
整体代码如下:
#include <bits/stdc++.h>
using namespace std;
vector<int> sz;
vector<int> qk;
bool san(int s){
if (s<=1) return false;
double m=sqrt(s);
for (int i=2;i<=m;i++){
if (s%i==0) return false;
}
sz.push_back(s);
return true;
}
int main(){
int b;
cin>>b;
for (int i=0;i<10000;i++){
san(i);
}
for (int i=0;i<=sz.size();i++){
for (int j=0;j<=sz.size();j++){
if(sz[i]+sz[j]==b){
qk.push_back(sz[i]*sz[j]);
// cout<<"###"<<sz[i]<<" "<<sz[j]<<endl;
}
}
}
sort(qk.begin(),qk.end());
reverse(qk.begin(),qk.end());
cout<<qk[0];
// for(int p:qk) cout<<p<<endl;
// cout<<endl<<sz.size()<<endl;
}
我们提交上去看看
全部AC
最后希望关注下微信公众号