• 神奇数--全国模拟(三)


    [编程题] 神奇数
    时间限制:1秒
    空间限制:32768K
    给出一个区间[a, b],计算区间内“神奇数”的个数。
    神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
    比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。 
    输入描述:
    输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000)。
     
     
    输出描述:
    输出为一个整数,表示区间内满足条件的整数个数
     
    输入例子:
    11 20
     
    输出例子:
    6
     
    解题思路:
    1)遍历a-b  特殊情况判断如果b<=10  输出0,如果a<=10 a=11
    2)将数按位存在wei中,然后在wei中取两位组成result1和result2
    3)判断result1和result2是否为质数
     
    本题注意:题目中1 ≤ a ≤ b ≤ 10000实际测试时例子11 11111没有进行b的范围的判断,因此不需要管题目说明中b的最大范围
     
      1 #include <iostream>
      2 #include <vector>
      3 using namespace std;
      4  
      5 int main()
      6 {
      7     int a;
      8     int b;
      9     vector<int> wei1;//倒序存储每一位
     10     vector<int> wei;//正序存储每一位
     11     int tmp;
     12     int result1 = 0;
     13     int result2 = 0;
     14     while(cin>>a>>b)
     15     {
     16         int count=0;
     17         int num = 0;
     18         if(b <= 10)
     19             cout<<count<<endl;
     20         else
     21         {
     22             if(a<=10)
     23                 a = 11;
     24             for(int i=a;i<=b;i++)
     25             {
     26                 num=0;
     27                 tmp = i;
     28                 while(tmp)
     29                 {
     30                     wei1.push_back(tmp%10);
     31                     tmp = tmp/10;
     32                 }
     33                 for(int x=wei1.size()-1;x>=0;x--)
     34                 {
     35                     wei.push_back(wei1[x]);
     36                 }
     37                 
     38  
     39                 for(int k=0;k<wei.size();k++)
     40                 {
     41                     for(int z=k+1;z<wei.size();z++)
     42                     {
     43                         num = 0;//此处别忘了num置0
     44                         result1 = wei[k]*10+wei[z];
     45                         result2 = wei[z]*10+wei[k];
     46                         //判断result是否为质数
     47                         if(result1/10 == 0)
     48                         {
     49                             result1 = 0;
     50                             num++;
     51                         }
     52  
     53                         for(int j=2;j<result1;j++)
     54                         {
     55                             if(result1%j==0)
     56                             {
     57                                 num++;
     58                             }
     59                         }
     60                         if(num == 0)
     61                         {
     62                             break;
     63                         }
     64  
     65                         else
     66                         {
     67                             num = 0;
     68                             if(result2/10 == 0)
     69                             {
     70                                 result2 = 0;
     71                                 num++;
     72                             }
     73  
     74                             for(int j=2;j<result2;j++)
     75                             {
     76                                 if(result2%j==0)
     77                                 {
     78                                     num++;
     79                                     break;
     80                                 }
     81                             }
     82                             if(num == 0)
     83                             {
     84                                 break;
     85                             }
     86                         }
     87                     }
     88  
     89                     if(num == 0)
     90                     {
     91                         count++;
     92                         break;
     93                     }
     94                 }
     95                 wei.clear();
     96                 wei1.clear();
     97             }
     98         }
     99         cout<<count<<endl;
    100     }
    101 }

     更好的方法:

     1 #include <bits/stdc++.h>
     2  
     3 using namespace std;
     4  
     5 bool isprime(int x) {
     6     for(int i = 2; i * i <= x; i++) {
     7         if(x % i == 0) return false;
     8     }
     9     return true;
    10 }
    11 bool check(int x) {
    12     int cnt[10];
    13     memset(cnt, 0, sizeof(cnt));
    14     //此步骤相当于去重了数字,保证相同的数字存在相同位置
    15     while(x) {
    16         cnt[x % 10]++;
    17         x /= 10;
    18     }
    19     for(int i = 1; i < 10; i++) {
    20         for(int j = 1; j < 10; j++) {
    21             //取出两个不同的数
    22             if(i != j && cnt[i] && cnt[j]) {
    23                 if(isprime(i * 10 + j)) return true;
    24             }
    25             //取出相同的数,且这个数字在原数中至少有两个
    26             else if(i == j && cnt[i] >= 2) {
    27                 if(isprime(i * 10 + j)) return true;
    28             }
    29         }
    30     }
    31     return false;
    32 }
    33 int main() {
    34     int a, b, ans = 0;;
    35     cin >> a >> b;
    36     for(int i = a; i <= b; i++) {
    37         if(check(i)) ans++;
    38     }
    39     cout << ans << endl;
    40     return 0;
    41 }                    
  • 相关阅读:
    LeetCode——二叉树中的最大路径和
    LeetCode——验证回文串
    LeetCode——word-ladder*
    LeetCode——最长连续序列
    3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网
    GSM、GPRS、EDGE、2G、3G与WAP的关系
    3G 2G GPRS 1G的概念
    那些精华博客
    单片机系统与标准PC键盘的接口模块设计
    以多个实例方式打开Notepad++
  • 原文地址:https://www.cnblogs.com/qqky/p/6884656.html
Copyright © 2020-2023  润新知