class Solution
{
public:
int NumberOf1Between1AndN( unsignedint n )
{
int number = 0;
for ( int i = 0; i <= n; i++ )
{
number += NumberOf1( i );
}
return number;
}
int NumberOf1( unsignedint n )
{
int number = 0;
while ( n )
{
if ( n % 10 == 1 )
number++;
n = n / 10;
}
return number;
}
};
二、从数字规律着手解决
class Solution
{
public:
int NumberOf1Between1AndN( int n )
{
if ( n <= 0 )
return0;
char strN[50];
sprintf( strN, "%d", n );
return NumberOf1( strN );
}
int NumberOf1( constchar *strN )
{
if ( !strN || *strN < '0' || *strN > '9' || *strN == '\0' )
return0;
int first = *strN - '0';
unsignedint length = static_cast<unsignedint>( strlen( strN ) );
if ( length == 1 && first == 0 )
return0;
if ( length == 1 && first > 0 )
return1;
int numFirstDigit = 0;
if ( first > 1 )
numFirstDigit = PowerBase10( length-1 );
elseif ( first == 1 )
numFirstDigit = atoi( strN+1 ) + 1;
int numOtherDigits = first * ( length-1 ) * PowerBase10( length-2 ); //有些疑惑int numRecursive = NumberOf1( strN+1 );
return numFirstDigit+numOtherDigits+numRecursive;
}
int PowerBase10( unsignedint n )
{
int result = 1;
for ( unsignedint i = 0; i < n; ++i )
result *= 10;
return result;
}
};