#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 &lt; s1.size();i++){
	int idx = s1[i] - '0';
	s1[i] = mps[idx];
}

return s1 == s;

} int main(){

int F&#44;n;
cin &gt;&gt; F &gt;&gt; n;
int cnt = 0;
for(int i = 1;i &lt;= F;i++){
	for(int j = 1;j &lt;= n;j++){
		int gate = i *100 + j;
		if(check(gate)){
			cnt++;
		}
	}
}
cout &lt;&lt; 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&#44;n;
cin &gt;&gt; F &gt;&gt; n;
int cnt = 0;
for(int i = 1;i &lt;= F;i++){
	for(int j = 1;j &lt;= n;j++){
		int gate = i *100 + j;
		if(check(gate)){
			cnt++;
		}
	}
}
cout &lt;&lt; cnt;
	
return 0;

}



来源/分类

蓝桥杯 枚举