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

[编程题] 神奇数
时间限制: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 }                    
原文地址:https://www.cnblogs.com/qqky/p/6884656.html