一、题目链接
http://noi.openjudge.cn/ch0105/41/
二、解题思路
◎ 根据题意分解出两个子问题:计算给定整数中包含数字2的个数、计算给定区间内所有整数包含数字2的个数;
◎ 计算给定整数中包含数字2的个数:检测给定整数的各数位,每出现一次数字2,计数器加1;
◎ 计算给定区间内所有整数包含数字2的个数:对区间内所有的整数循环执行第一个子问题的计算过程,累加每个整数包含数字2的个数。
三、实施步骤
◆ 方法public 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。
◆ 方法public 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,输出计算结果。
四、Java程序
import java.util.Scanner;
public class Main {
public int countDigitTwo(int integer) {
int ans = 0;
while (integer != 0) {
if (integer % 10 == 2) {
ans++;
}
integer = integer / 10;
}
return ans;
}
public int numberOfDigitTwo(int L, int R) {
int ans = 0;
for (int i = L; i <= R; i++) {
ans = ans + countDigitTwo(i);
}
return ans;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int L = input.nextInt();
int R = input.nextInt();
System.out.print(test.numberOfDigitTwo(L, R));
}
}