public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int i=0; int a= (int) Math.pow(10,i); while(a<=n){ i=i+1; a=(int) Math.pow(10,i); } int p= i; int sum=0; for (int t=1;t<=p;t++){ int temp= (int) Math.pow(10,t); int x=n/temp; int y=n%temp; int m=(int) Math.pow(10,t-1); if(y>=2*m){ sum=sum+x*m+m; }else if(y<m){ sum=sum+x*m; }else{ sum=sum+x*m+y-m+1; } } return sum; } }
思路:按位数计算
个位的1每10出现一次
十位的1每百出现10次
。。。
10^n位的1每10^(n+1)出现10^n次
对于不足10^(n+1)部分
判断是否大于10^(n)*2是正常加上去
小于10^n不加
等于10^n
加上 y-10^n+1 其中y是数num%10^(n+1)余数