【暴力】楼层

版权声明:欢迎借鉴,禁止ctrl+c https://blog.csdn.net/hunkwu/article/details/89415949

题目:

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);//输出答案
}

猜你喜欢

转载自blog.csdn.net/hunkwu/article/details/89415949