#P2580. 标记门牌号【STEMA 模拟十六】
标记门牌号【STEMA 模拟十六】
问题说明
一家酒店有F层高(0<F<100),每层都有 n 个房间(0<n<100),房间门牌号由不少于3位的数字组成:后两位是房间号,从1开始,不间断地排到n , 不足两位的前面补零;前面一或两位是楼层号,从1开始,不间断地排到F , 前面不补零。如1楼第8个房间门牌号是 108,12 楼第 16个房间门牌号是 1216 现在要为每个房间制作一个门牌号码的金属牌,每个金属牌都要定制模具,数字居中显示。 但如果某房间门牌上下颠倒过来的号码与原号码一模一样,就需要做一个特殊记号,以免混淆方向。
例如:8008、1691、6119、818、619 等等。 因为数字6倒过来是9;9倒过来是6;0、1 、8倒过来还是原数;其他数字倒过来不构成数字。 对于多位数618,倒过来看应该是819,与原来不一样,就不用做记号了。
输入楼层数 F和房间数 n,计算有多少房间的门牌号码需要做特殊记号 。
输入格式
输入两个正整数 F(0<F<100)和 n (0<n<100)中间一个空格隔开,代表酒店的楼层数和每层房间数 。输出格式
输出需要做特殊记号的门牌数。2 5
1
提示
101、102、103、104、105、201、202、203、204、205中,101 需要标记
内置函数做法
#include<iostream> #include<cstring> #include<algorithm> using namespace std;// 6:9 0:0 1:1 8:8 9:6 to_string() 和 reverse()
char mps[] = {'0','1','x','x','x','x','9','x','8','6'};
bool check(int num){ string s = to_string(num); string s1 = s; reverse(s1.begin(),s1.end());
for(int i = 0;i < s1.size();i++){ int idx = s1[i] - '0'; s1[i] = mps[idx]; } return s1 == s;
} int main(){
int F,n; cin >> F >> n; int cnt = 0; for(int i = 1;i <= F;i++){ for(int j = 1;j <= n;j++){ int gate = i *100 + j; if(check(gate)){ cnt++; } } } cout << cnt; return 0;
}
数位分离方法:
#include<iostream> #include<cstring> #include<algorithm> using namespace std;// 6:9 0:0 1:1 8:8 9:6 to_string() 和 reverse()
bool check(int num){ int t = num; int s = 0; // 数位分离反转数字 while(t){ int yu = t % 10; int ch; if(yu == 6) ch = 9; if(yu == 9) ch = 6; if(yu == 0 || yu == 8 || yu == 1) ch =yu; if(yu == 2 || yu == 3 || yu == 4 || yu == 5|| yu == 7) ch = 15; s = s*10 + ch; t/= 10; } return s == num; } int main(){
int F,n; cin >> F >> n; int cnt = 0; for(int i = 1;i <= F;i++){ for(int j = 1;j <= n;j++){ int gate = i *100 + j; if(check(gate)){ cnt++; } } } cout << cnt; return 0;
}