[编程题] 神奇数
时间限制: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 }