1的數目

 
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;
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章