洛谷B2134 质数的和与积

@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

最后希望关注下微信公众号

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值