题单地址:题单中心-东方博宜OJ
这里以二进制转十进制为例(按位加权求和法)

1290. 二进制转换十进制
问题描述
请将一个 25 位以内的 2 进制正整数转换为 1010 进制!
输入
一个 25 位以内的二进制正整数。
输出
该数对应的十进制。
样例
输入
111111111111111111111111
输出
16777215
解析: 按位加权(2^n)求和法。
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
int n = 0, ans = 1;
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
n += (s[i] - '0') * ans;
ans *= 2;
}
cout << n;
return 0;
}
1292. 十六进制转十进制
问题描述
请将一个不超过10位的十六进制正整数转换为十进制整数。
输入
10位以内的十六进制正整数,如果该十六进制中有字母,字母用大写英文字母表示。
输出
该数对应的十进制整数。
样例
输入
2ECF
输出
11983
解析:按位加权(16^n)求和法。注意大于10~15要使用字母A~F表达。
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
long long n = 0, ans = 1;
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
if(s[i] >= '0' && s[i] <= '9')n += (s[i] - '0') * ans;
else if(s[i] >= 'A' && s[i] <= 'Z')n += ((s[i] - 'A') + 10) * ans;
ans *= 16;
}
cout << n;
return 0;
}
1291. 八进制转十进制
问题描述
请将一个 20 位以内的八进制数转换为十进制整数。
输入
20 位以内的八进制数。
输出
该数对应的十进制数。
样例
输入
77777777777777777777
输出
1152921504606846975
解析:按位加权(8^n)求和法。
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
long long n = 0, ans = 1;
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
n += (s[i] - '0') * ans;
ans *= 8;
}
cout << n;
return 0;
}
1405. 小丽找潜在的素数
问题描述
小丽同学在编程中学到了二进制数的概念,她发现,有些二进制数,如果转为 10 进制,就是素数,小丽把这些数称为潜在的素数;比如 2 进制 1101011,转为 10 进制后为 107 ,就是素数。
请编程帮小丽找出,哪些二进制数转为 10 进制后,是素数,计算出这样的数有多少个?
输入
第一行是一个整数 n(10 ≤ n ≤ 100)。
接下来 n 行,每行是一个 30 位以内的 2 进制数
输出
一个整数代表所有转为 10 进制后是素数的 2 进制数的个数。
样例
输入
6
1010000
1011
1101001
10111
111
1101011
输出
4
解析:按位加权(2^n)求和法,将二进制转十进制,在判断是否为素数。
cpp
#include <bits/stdc++.h>
using namespace std;
bool prime(int x){
if(x < 2)return 0;
for(int i = 2; i <= sqrt(x); i++){
if(x % i == 0)return 0;
}
return 1;
}
int main() {
int n, sum = 0;
cin >> n;
while(n--){
string s;
int m = 0, ans = 1;
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
m += (s[i] - '0') * ans;
ans *= 2;
}
if(prime(m))sum++;
}
cout << sum;
return 0;
}