一、题目链接
http://noi.openjudge.cn/ch0105/40/
二、解题思路
◎ 根据题意可分解出两个子问题:
▲ 计算给定整数中包含数字1的个数;
▲ 计算[1,n]区间内所有整数包含数字1的个数;
◎ 计算给定整数中包含数字1的个数:
▲ 取给定整数的各数位,每出现一次数字1,计数器加1;
◎ 计算[1,n]区间内所有整数包含数字1的个数:
▲ 对区间内所有的整数循环执行第一个子问题的计算过程,累加每个整数包含数字1的个数。
三、实施步骤
◆ 设计方法public int countDigitOne(int integer)处理【计算给定整数中包含数字1的个数】业务逻辑:
*** 形式参数int integer代表给定整数;
*** 方法countDigitOne返回integer中包含数字1的个数。
◇ 方法countDigitOne实施步骤如下:
◎ 定义int类型的整数ans=0,代表integer中包含数字1的个数;
◎ 在integer不等于0时,循环处理如下:
▲ if integer%10==1:令ans++;
▲ 令integer=integer/10;
◎ 返回ans。
-----------------------------------------------------------------------------------------------------------------
◆ 设计方法public int numberOfDigitOne(int n)处理【计算[1,n]区间内所有整数包含数字1的个数】业务逻辑:
*** 形式参数int n代表区间的上界;
*** 方法numberOfDigitOne返回[1,n]区间内所有整数包含数字1的个数。
◇ 方法numberOfDigitOne实施步骤如下:
◎ 定义int类型的整数ans=0,代表[1,n]区间内所有整数包含数字1的个数;
◎ 通过标记i代表[1,n]区间内的每个整数,i从1开始,到n为止,递增步长为1,循环处理如下:
▲ 令ans=ans+countDigitOne(i);
◎ 返回ans。
-----------------------------------------------------------------------------------------------------------------
◆ 在main方法中输入区间上界n,将其作为实际参数注入方法numberOfDigitOne,输出计算结果。
四、Java程序
import java.util.Scanner;
public class Main {
public int countDigitOne(int integer) {
int ans = 0;
while (integer != 0) {
if (integer % 10 == 1) {
ans++;
}
integer = integer / 10;
}
return ans;
}
public int numberOfDigitOne(int n) {
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = ans + countDigitOne(i);
}
return ans;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.print(test.numberOfDigitOne(n));
}
}