zoukankan      html  css  js  c++  java
  • 找素数(一些数任意组合,DFS)

    素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除, 例如:2、3、5、97 等都是素数。2 是最小的素数。
    现在,给你 n 个数字,请你从中选取一部分,用它们拼出一个最大的素数。
    注意:某个数字出现多少次你就可以用多少次,6 与 9 不能混用。

    样例 输入   3 2 7 9

    样例输出    97


     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N = 100000 + 5;
     4 int vis[50];
     5 bool prime[N];//prime[i]表示i是不是质数
     6 int p[N], tot;//p[N]用来存质数
     7 int n,a[10];
     8  
     9 void init(){
    10     for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数
    11     for(int i = 2; i < N; i++){
    12         if(prime[i]) p[tot ++] = i;//把质数存起来
    13         for(int j = 0; j < tot && i * p[j] < N; j++){
    14             prime[i * p[j]] = false;
    15             if(i % p[j] == 0) break;//保证每个合数被它最小的质因数筛去
    16         }
    17     }
    18 }
    19 int ans;
    20 void dfs(int m,int num)
    21 {
    22     if (prime[num])
    23     {
    24         ans=max(ans,num);
    25     }
    26     if (m>=n)
    27     {
    28         return ;
    29     }
    30     for (int i=1;i<=n;i++)
    31     {
    32         if (!vis[i])
    33         {
    34             vis[i]=true;
    35             dfs(m+1,num*10+a[i]);
    36             vis[i]=false;
    37         }
    38     }
    39 }
    40  
    41 int main()
    42 {
    43    init();
    44    scanf("%d",&n);
    45    for(int i=1;i<=n;i++)
    46    {
    47        scanf("%d",&a[i]);
    48    }
    49    dfs(0,0); //从0开始,使每一个数都有成为个位数的可能
    50    if(ans) printf("%d",ans);
    51    else printf("-1
    ");
    52    return 0;
    53 }
     
  • 相关阅读:
    HPA
    docker 入门
    idea手动保存文本
    mac下安装配置sql plus
    oracle序列
    oracle存储过程
    Java正则表达式
    expect命令
    关于OneDrive/GoogleDrive推送的定价方案征询
    存储设备故障已修复,及对用户的补偿措施
  • 原文地址:https://www.cnblogs.com/sylvia1111/p/12247533.html
Copyright © 2011-2022 走看看