题干如下:
小丽同学在编程中学到了二进制数的概念,她发现,有些二进制数,如果转为 1010 进制,就是素数,小丽把这些数称为潜在的素数;比如 22 进制 11010111101011,转为 1010 进制后为 107107 ,就是素数。
请编程帮小丽找出,哪些二进制数转为 1010 进制后,是素数,计算出这样的数有多少个?
输入
第一行是一个整数 nn(10≤n≤10010≤n≤100)。
接下来 nn 行,每行是一个 3030 位以内的 22 进制数
输出
一个整数代表所有转为 1010 进制后是素数的 22 进制数的个数。
样例
输入 6 1010000 1011 1101001 10111 111 1101011
输出 4
源代码-示例如下:
这个题目其实很不错,很适合考查基础,综合考查了几个点,你如经典的判断素数,进制转换,也有字符串,控制结构。
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
// 判断一个数是否为素数的函数
bool isPrime(int num) {
if (num < 2)
return false; // 小于2的数不是素数,直接返回false
for (int i = 2; i <= sqrt(num); i++) { // 从2开始到该数的平方根遍历
if (num % i == 0)
return false; // 如果能被整除,就不是素数,返回false
}
return true; // 遍历完都没被整除,是素数,返回true
}
// 计算2的i次方的函数,用于模拟位权
int powerOfTwo(int i) {
int result = 1;
for (int j = 0; j < i; j++) {
result *= 2;
}
return result;
}
// 二进制转十进制的函数
int binToDec(string bin) {
int decimal = 0;
int len = bin.length();
for (int i = 0; i < len; i++) {
// 使用powerOfTwo函数计算当前位的位权,替代了之前的(1 << i)操作
decimal += (bin[len - i - 1] - '0') * powerOfTwo(i);
}
return decimal;
}
int main() {
int n;
cin >> n;
int count = 0; // 用于记录转为十进制后是素数的二进制数的个数
for (int i = 0; i < n; i++) {
string bin;
cin >> bin;
int decimalNum = binToDec(bin); // 先将二进制数转换为十进制数
if (isPrime(decimalNum)) { // 判断转换后的十进制数是否为素数
count++; // 如果是素数,个数加1
}
}
cout << count << endl;
return 0;
}