Content
给定一个数 \(n\),判断其数位中是否恰好有 \(k\) 个 \(3\)。
数据范围:\(1<n\leqslant 10^{15}\),\(1<k\leqslant 15\)。
Solution
我们先考虑如何分离出每个数位,其实很简单。我们都知道,\(n\bmod 10\) 就是 \(n\) 的个位,而 \(n\leftarrow\left\lfloor\dfrac n{10}\right\rfloor\)(向下取整)就相当于把 \(n\) 的个位去掉,因此我们可以不断地提取出 \(n\bmod 10\),判断其是否 \(=3\) 再加进计数器中,再进行 \(n\leftarrow\left\lfloor\dfrac n{10}\right\rfloor\) 这个操作,直至 \(n\) 变为 \(0\) 为止。最后判断计数器是否等于 \(k\) 即可。
Code
代码中采用了不一样的一种判断方法,即碰到数位 \(3\) 就让 \(k\leftarrow k-1\),最后判断是否恰好减至 \(k=0\) 即可。
#include <cstdio>
using namespace std;
long long n; int k;
int main() {
scanf("%lld%d", &n, &k);
while(n) {
if(n % 10 == 3) k--;
n /= 10;
}
if(k == 0) printf("YES");
else printf("NO");
return 0;
}