计算数字k在0到n出现的数字,k为0-9的一个值
例子:
输入:
k = 1, n = 1
输出:
1
解释:
在 [0, 1] 中,我们发现 1 出现了 1 次 (1)。
样例 2:
输入:
k = 1, n = 12
输出:
5
解释:
在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 中,我们发现 1 出现了 5 次 (1, 10, 11, 12)(注意11中有两个1)。
题目要求输入一个数n,与一个待匹配的数k,计算0-n中k出现的次数
那么首先肯定是用for循环从0到n的n+1个数
接下来就需要对0-n中每个数字每个位进行提取,比如当i循环到213时,我就必须提取2、1、3三个数字,再分别与k比较,相等的话count++。
那么怎么提取呢?
我在纸上写写画画发现,213/100=2得到百位数2,再213%100=13得到剩下未比较的13,再13/10=1得到十位数1,再13%10得到3,依此循环。
这个方法有个关键是要提前知道213的位数,这也非常简单
中间要用到计算10的几次方,这里用的是math.h里的pow函数,注意它返回的是double型的,要进行int转化
#include<iostream>
#include<conio.h>
#include<math.h>
//计算数字k在0到n出现的数字,k为0-9的一个值
int main()
{
int n, k;
int count = 0;
int j = 0, num = 0;
std::cin >> k >> n;
for (int i = 0; i <= n; i++) {
if (i == k) {
count++;
}
//计算i是几位数,这里num表示位数减1.
j = i;
num = 0;
while (j >= 10) {
j /= 10;
num++;
}
//如果是两位数及以上的再分割各位数数字进行比较
j = i;
if (num > 0) {
//从大到小提取各位数
for (int a = num; a >= 0; a--) {
if ((int)(j / pow(10, a)) == k) {
count++;
}
j = j % ((int)pow(10, a));
}
}
}
std::cout << "累计" << count << std::endl;
system("pause");
return 0;
}
结果