从数字规律来分析
一位数的情况:
1.大于等于1的时候,有1个;
2.小于1的时候,有0个。
两位数的情况:
》》个位数的情况:
1.如果个位数大于等于1,则个位数出现1的次数==十位数上的数字+1;
2.如果个位数等于0,则个位数出现1的次数==十位数上的数字
》》十位数的情况:
1.如果十位数上的数字等于1,则十位数出现1的次数==个位数上数字+1;
2.如果十位数上的数字大于1,则十位数出现1的次数==10;
更一般的情况:输入一个数字N,百位上出现1的次数
1.如果百位上数字为0,则百位上出现1的次数由更高位决定:等于更高位数字乘以当前位数
例如:12013,百位上出现1的情况:100~199,1100~1199,2100~2199.。。。。11100~11199 等于12*100;
2.如果百位上数字大于1,则百位上出现1的次数由更高位决定:等于更高位数字+1然后乘以当前位数
例如:12213 ,百位上出现1的次数为:(12+1)*100
3.如果百位上数字为1,则百位上出现1的次数由更高位和更低位共同决定:
例如:12113,百位上出现1的次数:①高位影响:1200,②低位影响:13+1;
package Thread;
/**
*问题描述:从1到n整数中1出现的次数
* 输入:12---(1,10,11,12)
* 输出:1一共出现了5次
* Created by lxq on 2017/9/5.
*/
public class Problem4 {
public static void main(String[] args){
Problem4 problem4 = new Problem4();
System.out.println(problem4.countOne(123));
}
public long countOne(long n){
long count = 0;
long i =1;
long current = 0,after = 0,before = 0;
while((n/i)!=0){
// 12213/100=122;122%10=2,为百位上数字
current = (n/i)%10; //当前位数字
// 12213/(100*10)=12,百威以上数字
before = n/(i*10);//高位数字
// 12113-(12113/100)*100=13,百位以下数字
after = n-(n/i)*i;//低位数字
if(current>1)
count = count+(before+1)*i;
else if(current==0)
count = count +before*i;
else if(current==1)
count = count+before*i+after+1;
i=i*10;
}
return count;
}
}