楼层
题目大意:
有两个数m和t,问1~m之间去掉有数字t的数之后还有多少个数
原题:
题目描述
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
解题思路:
枚举1~m的每一个数,在判断是否有t就可以了,但t=0的情况要特殊处理
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int m,t,ans,d1,d2,d3,d4,d5;
bool pd(int dep)
{d1=dep/10000;//去每一位d2=dep/1000%10;d3=dep/100%10;d4=dep/10%10;d5=dep%10;if(t==0)//如果直接判断,会把最高位后面的0也算进去,但它是不算的{if (dep>=10000)if (d2==0||d3==0||d4==0||d5==0) return true;else return false;if (dep>=1000)if (d3==0||d4==0||d5==0) return true;else return false;if (dep>=100)if (d4==0||d5==0) return true;else return false;if (dep>=10)if (d5==0) return true;else return false;if (dep>=1) return false;return true;}if (d1==t||d2==t||d3==t||d4==t||d5==t) return true;//直接判断return false;
}
int main()
{scanf("%d %d",&m,&t);if (m==100000)//特殊情况{m--;if (t!=1&&t!=0) ans++;}for (int i=1;i<=m;++i)//枚举每个数if (!pd(i)) ans++;printf("%d",ans);
}