C++洛谷题解(35)——P1980
题目信息
题名:计数问题
题目:试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入格式:2 个整数 n,x,之间用一个空格隔开。
输出格式:1 个整数,表示 x 出现的次数。
输入样例:11 1
输出样例:4
说明提示:对于 100% 的数据,1≤n≤10⁶,0≤x≤9。
分析题目
怎么感觉这道题特别熟悉?貌似在哪里做过,但是哪里都没有记录。嘶,在哪呢?好吧,忘了,有可能是在梦里吧。(纯属凑字)
这道题光看题很简单,不就统计吗。结果写的时候懵了。后来反应了一会后又很简单。这道题需要将每个数的数据都拆开,再计数。不过这就很简单,%10和/10的事吗。
好了,直接说思路吧:
- 创建变量n,x,b,c,t。其中t初始化为0
- 输入n和x
- 遍历1~n之间的数
- 为了不破坏i,所以用b来替代一下
- 只要b不是0就循环
- 用%10的方法求出当前位上的数
- 用/10的方法去掉当前位上的数
- 如果c==x那么t累加
- 最后输出t的值
OK,直接上代码吧
示例代码
注释版:
#include <bits/stdc++.h> //万能头
using namespace std;
int main()
{
int n, x, b, c, t = 0; //变量n和x。b和c后期使用。t为结果
cin >> n >> x; //输入n和x
for (int i = 1; i <= n; i++) //循环n遍
{
b = i; //为了不破坏i,所以用b来代替
while (b != 0) //只要b不等于0就无限循环
{
c = b % 10; //求出当前位上的数字
b = b / 10; //去掉当前位上的数
if (c == x) //如果获取的数和x相等
{
t++; // t累加
}
}
}
cout << t << endl; //输出t的值
system("pause"); //算了,不说了,都知道了
return 0; //结束
}
复制版:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, x, b, c, t = 0;
cin >> n >> x;
for (int i = 1; i <= n; i++)
{
b = i;
while (b != 0)
{
c = b % 10;
b = b / 10;
if (c == x)
{
t++;
}
}
}
cout << t << endl;
system("pause");
return 0;
}