侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

质数的和

Hope
2022-03-24 / 0 评论 / 0 点赞 / 328 阅读 / 1,009 字
温馨提示:
本文最后更新于 2022-03-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

问题描述:
输入任意的数将其分解成两个质数相加的形式,输出总共有多少总分解方式,分解因子不区分排序

输入格式:总共一行,输入被分解的数字n
输出格式:输出可以分解的所有方案,不区分顺序,最后一行输出方案个数。

例1:
输入:
100
输出:
100=3+97
100=11+89
100=17+83
100=29+71
100=41+59
100=47+53
6

思路:

用一个数组记录分解的质数,然后问题就变成了两数之和。

代码:

#include<iostream>
#include<vector>
#include<unordered_set> 
using namespace std;
int n;
const int N = 1e5+10;
int st[N];
int Prime[N];
int cnt;

void Is_prime(int x){
    for(int i = 2; i <= x; i++){
        if(!st[i]) Prime[cnt++] = i;
        for(int j = 0; Prime[j] <= x / i; j++){
            st[Prime[j] * i] = true;
            if(i % Prime[j] == 0) break;
        }
    }
}


int main(){
    cin>>n;
    Is_prime(n);
    unordered_set<int> hash;
    vector<string> res;
    for(int i = 0;i < cnt; i++) {
        //cout<<Prime[i]<<endl;
        int x = n - Prime[i];
        if(hash.count(x)){
            //cout<<x<<" " <<Prime[i]<<endl;
            string path;
            path += to_string(n);
            //cout<<n<<endl;
            path += '=';
            path += to_string(Prime[i]);
            path += '+';
            path += to_string(x);
            res.push_back(path);
            //cout<<path<<endl;
        }
        else hash.insert(Prime[i]);
    }
    for(auto s : res) cout<<s<<endl;
    cout<<res.size();
    return 0;
}

0

评论区