/*
解题思路:求出n的每一位,包括个位十位百位千位等位置1出现的次数相加即可。以1111为例,个位上出现1的次数为111+1次,111为个位1前面的三位数字。(在简单一点就是如91,个位出现的次数为9+1,1,11,21,32,41,51,61,71,81,91),十位上1出现的个数为n/100*10(每过100的时候,10位上的1就会多10个,) ,当十位不满20的时候便%10取余数相加即可。百位千位同理,就不在赘述。上代码
*/
这是逻辑代码
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n){
int ones = 0;
for (long long m = 1; m <= n; m *= 10)
ones += (n/m + 8) / 10 * m + (n/m % 10 == 1) * (n%m + 1);
return ones;
}
}
这是实现后的代码
public class test {
public static void main(String[] args){
int s= testt(1111);
System.out.println(s);
}
public static int testt(int n) {
int x=0;
int num = 0;
for (int i = 1; i <= n; i *= 10) {
num += ((n / i + 8) / 10) * i + s(n,i) * (n % i + 1);
System.out.println( "这次第"+(++x)+"次" + ((n / i + 8) / 10) * i );
System.out.println( "这次第"+x+"次" + s(n,i) * (n % i + 1) );
}
return num;
}
public static int s(int n,int i){
if((n / i % 10 == 1)){
return 1;
}
return 0;
}
}