题目
原题地址
题目描述
请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数。比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次。
输入输出格式
输入格式:
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出格式:
输出共 1 行,表示数字 2 出现的次数。
输入输出样例
输入样例#1:
【输入样例1】
2 22
【输入样例2】
2 100
输出样例#1:
【输出样例1】
6
【输出样例2】
20
说明
1 ≤ L ≤R≤ 100000。
题解
没什么好说的,使用数学方法暴力枚举每个数的每一位检查即可。不过这题实际上还有另一种字符串做法(其实还可以用数位DP,只不过蒟蒻写不来就是了。。。),使用sstream把每个数从int转换为string并存到一个数组里(手动拼接),然后遍历一遍数组即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int L = -1, R = -1;
int result = 0;
cin >> L >> R;
for(int count = L; count <= R; count++){
int temp = count;
while(temp){
if(temp%10 == 2)
result++;
temp/=10;
}
}
cout << result << endl;
return 0;
}
字符串方法代码(该代码来源于洛谷博客):
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
inline string Str(int i)//数字转换成字符串
{
stringstream ss;
ss << i;
return ss.str();//返回值
}
string s;
int l,r,ans;
int main()
{
cin >> l >> r;
for (int i=l;i<=r;++i)
s += Str(i);//将i转换成字符串后累加到s中
int len = s.length();
for (int i=0;i<len;++i)//枚举每一位
if (s[i] == '2')
{
ans ++;//累加ans
}
cout << ans;//输出
return 0;
}