题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
思路:
当计算右数第 i 位包含的 X 的个数时:
1.取第 i 位左边的数字(高位),乘以 10 ^(i−1) ,得到基础值 a 。
2.取第 i 位数字,计算修正值:
A、如果大于 X,则结果为 a+ 10 ^(i−1) 。
B、如果小于 X,则结果为 a 。
C、如果等 X,则取第 i 位右边(低位)数字,设为 b ,最后结果为 a+b+1
代码:
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { if(n==0 || n<0){ return 0; } return GetOneCount(n,1); } public int GetOneCount(int n,int x) { if(n<0||x<1||x>9) return 0; int high,low,curr,tmp,i = 1; high = n; int total = 0; while(high!=0){ high = n/(int)Math.pow(10, i);// 获取第i位的高位 tmp = n%(int)Math.pow(10, i); curr = tmp/(int)Math.pow(10, i-1);// 获取第i位 low = tmp%(int)Math.pow(10, i-1);// 获取第i位的低位 if(curr==x){ total+= high*(int)Math.pow(10, i-1)+low+1; }else if(curr<x){ total+=high*(int)Math.pow(10, i-1); }else{ total+=(high+1)*(int)Math.pow(10, i-1); } i++; } return total; } }