题目:
mxy 感觉新世界的大门打开了。
ta 决定要在新世界的旅馆中找间房住。已知新世界每天都有一个高能的数字 t,这个数字在楼层中是不会出现的。我们以 t=3 为例,则 3,13,31,33 等楼层是不存在的,楼层编号为 1,2,4,5……,所以实际上的 4 楼才是 3 楼。
已知 mxy 订了编号为 m 层的房间,并且当天高能数字是 t,现在 ta 想知道 ta 的房间真实楼层是多少。(保证 m 对 t 合法)
输入:
一行 2 个整数 m 和 t。(1≤m≤100000,0≤t≤9)
输出:
一行一个整数,表示真实楼层。
样例输入:
14 3
样例输出:
12
思路:
首先我们来看样例,列个表:
14 |
---|
12 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
大概这层楼是长这个样子的,然后我们把含有二的数字如下图抽出来
14 |
---|
12 |
13 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
1 |
发现少了两个数:“2”和“12”,然后我们就可以用暴力来算,因为他数据范围十分小。
代码:
#include<cstdio>
using namespace std;
int n,m,ans;
int main()
{
scanf("%d%d",&n,&m);
if(n<m){printf("%d",&m);return 0;}//个位
if(m!=0) ans=n-1;
else ans=n;//代替
for(int i=10;i<=99;i++)//10~99的范围
{
if(i>n){printf("%d",ans);return 0;}
if(i%10==m||i/10==m)ans--;//分离数
}
for(int i=100;i<=999;i++)//100~999的范围
{
if(i>n){printf("%d",ans);return 0;}
if(i/100==m||i/10%10==m||i%10==m)ans--;
}
for(int i=1000;i<=9999;i++)//1000~9999的范围
{
if(i>n){printf("%d",ans);return 0;}
if(i/1000==m||i/100%10==m||i/10%10==m||i%10==m)ans--;
}
for(int i=10000;i<=99999;i++)//10000~99999的范围
{
if(i>n){printf("%d",ans);return 0;}
if(i/10000==m||i/1000%10==m||i/100%10==m||i/10%10==m||i%10==m)ans--;
}
if(n=100000&&(m==1||m==0))ans--; //特判
printf("%d",ans);//输出答案
}