import java.util.Scanner;
/*
* @topic:編程之美第一章,1的數目
*/
public class OneNum{
public static void main(String[] args) {
//System.out.println("Hello Landor!");
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
System.out.println(f(n));
//System.out.println(Long.MAX_VALUE);
}
/*
* 常規思維比較簡單,但是效率太低
public static long f(long n){
long sum = 0 ;
for(long i = 1 ; i <= n ; i++){
sum += oneCount(i);
}
return sum;
}//遍歷1-n 將1的個數累加
public static long oneCount(long n){
long one = 0 ;
while(n!=0){
one += (n%10==1?1:0);
n /= 10;
}
return one;
}//求出每個數中1的個數
*/
/*
* 第二種方法是通過只分析N而得到的,只考慮在N的每個位數上1出現的次數即可
* 比如 12X4: 那麼在十位上出現1的個數即爲 : 注:此時12爲高位、X爲當前位、4爲低位
* 當X=0時,有 10-19、110-119、210-219、、、1110-1119 一共12*10=120個,僅由高位決定
* 當X=1時,有 上面的120個加上1210、1211、1212、1213、1214 有 120+(4+1) = 125個,由高位低位共同決定
* 當X=2-9時,有 10-19、110-119、210-219、、、1110-1119、1210-1219 一共(12+1)*10=130個,僅由高位決定
*/
public static long f(long n){
long iCount = 0;//總數
long iFactor = 1;
long low = 0;//低位
long iCurrent = 0;//當前位
long high = 0 ;//高位
while(n/iFactor != 0){
low = n - (n/iFactor)*iFactor;
iCurrent = (n/iFactor)%10;
high = n/(iFactor*10);
switch((int)iCurrent){
case 0://X=0
iCount += high * iFactor;
break;
case 1://X=1
iCount += high * iFactor + low +1 ;
break;
default://X=2-9
iCount += (high+1) * iFactor;
break;
}
iFactor *= 10;
}
return iCount;
}
}
1的數目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.