题解 | #整数中1出现的次数(从1到n整数中1出现的次数)#
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
一步步分情况讨论
public:
int get_99(int n){
if(0 <n && n < 9){
return 1;
}
if(n == 10){
return 2;
}
else if(n < 20){
return n - 7;
}
else if( n < 100){
int a = 0, b = 0;
a = n / 10;
b = n % 10 > 0? 1 : 0;
return n / 10 + 10 + b;
}
return 0;
}
int get_999(int n){
if(0 <n && n < 9){
return 1;
}
if(n == 10){
return 2;
}
else if(n < 20){
return n - 7;
}
else if( n < 100){
int a = 0, b = 0;
a = n / 10;
b = n % 10 > 0? 1 : 0;
return n / 10 + 10 + b;
}
else if( n < 200){
int c = n % 100;
if(c < 9){
c = c + 1;
}
else if(c < 20){
c = c + c - 8;
}
else if( c < 100){
int a = 0, b = 0;
a = c / 10;
b = c % 10 > 0? 1 : 0;
c = c + c / 10 + 10 + b;
}
return c + 20;
}
else if(n < 1000){
return 20 * (n / 100) + 100 + get_99(n % 100);
}
return 0;
}
int get_9999(int n){
if(n == 0){return 0;}
if(0 <n && n < 9){
return 1;
}
if(n == 10){
return 2;
}
else if(n < 20){
return n - 7;
}
else if( n < 100){
int a = 0, b = 0;
a = n / 10;
b = n % 10 > 0? 1 : 0;
return n / 10 + 10 + b;
}
else if( n < 200){
int c = n % 100;
if(c < 9){
c = c + 1;
}
else if(c < 20){
c = c + c - 7;
}
else if( c < 100){
int a = 0, b = 0;
a = c / 10;
b = c % 10 > 0? 1 : 0;
c = c + c / 10 + 10 + b;
}
return c + 20;
}
else if(n < 1000){
return 20 * (n / 100) + 100 + get_99(n % 100);
}
else if(n < 2000){
return n % 1000 + get_999(n % 1000) + 300 + 1;
}
else if(n < 10000){
return 300*(n/1000) + 1000 + get_999(n % 1000);
}
return 0;
}
int NumberOf1Between1AndN_Solution(int n) {
if(n == 0){return 0;}
if(0 < n && n < 9){
return 1;
}
if(n == 10){
return 2;
}
else if(n < 20){
return n - 7;
}
else if( n < 100){
int a = 0, b = 0;
a = n / 10;
b = n % 10 > 0? 1 : 0;
return n / 10 + 10 + b;
}
else if( n < 200){
int c = n % 100;
if(c < 9){
c = c + 1;
}
else if(c < 20){
c = c + c - 7;
}
else if( c < 100){
int a = 0, b = 0;
a = c / 10;
b = c % 10 > 0? 1 : 0;
c = c + c / 10 + 10 + b;
}
return c + 20;
}
else if(n < 1000){
return 20 * (n / 100) + 100 + get_99(n % 100);
}
else if(n < 2000){
return n % 1000 + get_999(n % 1000) + 300 + 1;
}
else if(n < 10000){
return 300*(n/1000) + 1000 + get_999(n % 1000);
}
else if(n < 20000){
return n % 10000 + 4000 + get_9999(n % 10000) + 1;
}else{
return 4000*(n/10000) + 10000 + get_9999(n % 10000);
}
}
};