解1:简单粗暴的统计法。
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int result = 0;
for (int i = 1;i<=n;i++){
int temp = i;
while (temp>0){
if (temp%10 == 1){
result++;
}
temp /=10;
}
}
System.out.println(result);
}
}
解2:
package com.hzyanglili1.mytest.java;
import java.util.Scanner;
/**
* Created by hzyanglili1 on 2016/11/29.
*/
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(getResult(n));
}
public static int[] getDigit(int num){
int digit = 1;
while (num/10 > 0){
digit++;
num = num/10;
}
return new int[]{digit,num};
}
public static int getResult(int n){
int digitNum = getDigit(n)[0];
int digitH = getDigit(n)[1];
if (n == 0) return 0;
if (n<=9) return 1;
if (digitH == 1){
//首位为1
//n - (int)Math.pow(10,digitNum - 1) + 1 :最高位为1的所有情况
//(digitNum - 1)*2*((int)Math.pow(10,digitNum-2)) 其余各位为1的情况和
return n - (int)Math.pow(10,digitNum - 1) + 1 + (digitNum - 1)*2*((int)Math.pow(10,digitNum-2));
}else {
return (digitH)*getResult((int)Math.pow(10,digitNum-1)-1)+(int)Math.pow(10,digitNum-1) + getResult(n - digitH*(int)Math.pow(10,digitNum-1));
}
}
}