一、题目链接
http://noi.openjudge.cn/ch0105/41/
二、解题思路
◎ 根据题意分解出两个子问题:计算给定整数中包含数字2的个数、计算给定区间内所有整数包含数字2的个数;
◎ 计算给定整数中包含数字2的个数:检测给定整数的各数位,每出现一次数字2,计数器加1;
◎ 计算给定区间内所有整数包含数字2的个数:对区间内所有的整数循环执行第一个子问题的计算过程,累加每个整数包含数字2的个数。
三、实施步骤
◆ 函数int countDigitTwo(int integer)处理计算给定整数中包含数字2的个数业务逻辑:
→ 参数integer为int类型的整数,代表给定整数;
→ 函数countDigitTwo返回int类型的整数,代表integer中包含数字2的个数。
◇ 函数countDigitTwo实施步骤如下:
◎ 首先,定义int类型的整数ans,代表integer中包含数字2的个数,初始时ans为0;
◎ 其次,在integer不等于0时,循环处理如下:
→ 如果integer%10==2:令ans++;
→ 令integer=integer/10;
◎ 最后,返回ans。
◆ 函数int numberOfDigitTwo(int L, int R)处理计算给定区间内所有整数包含数字2的个数业务逻辑:
→ 参数L为int类型的整数,代表区间的下界;
→ 参数R为int类型的整数,代表区间的上界;
→ 函数numberOfDigitTwo返回int类型的整数,代表[L,R]区间内所有整数包含数字2的个数。
◇ 函数numberOfDigitTwo实施步骤如下:
◎ 首先,定义int类型的整数ans,代表[L,R]区间内所有整数包含数字2的个数,初始时ans为0;
◎ 其次,通过标记i代表[L,R]区间内的每个整数,i从L开始,到R为止,更新步长为1,循环处理如下:
→ 令ans=ans+countDigitTwo(i);
◎ 最后,返回ans。
◇ 在主函数main中输入区间下界L和上界R,将它们作为参数注入函数numberOfDigitTwo,输出计算结果。
四、C++程序
#include <iostream>
using namespace std;
int countDigitTwo(int integer)
{
int ans = 0;
while (integer != 0)
{
if (integer % 10 == 2)
{
ans++;
}
integer = integer / 10;
}
return ans;
}
int numberOfDigitTwo(int L, int R)
{
int ans = 0;
for (int i = L; i <= R; i++)
{
ans = ans + countDigitTwo(i);
}
return ans;
}
int main()
{
int L, R;
cin >> L >> R;
cout << numberOfDigitTwo(L, R);
return 0;
}