título
El método
será se lleva a cabo un número de cada dígito de la suma, el resultado final es una aparece número total. Sin embargo, este método es menos eficiente, es la complejidad de tiempo
, Cuando n es muy grande, se requiere una gran cantidad de computación.
código:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(n<=0)
return 0;
int sumOfOne=0;
//注意边界条件:起始是从1开始的
for(int i=1;i<=n;++i)
{
sumOfOne+=NumOfOne(i);
}
return sumOfOne;
}
int NumOfOne(int n)
{
int everyCount=0;
// 求每个数字中有多少个1
while(n)
{
if(n%10==1)
++everyCount;
n/=10;
}
return everyCount;
}
};
Método dos:
uno, el análisis
lata
es juzgado para contener cada dígito del número 1. n contiene
bits.
Ideas resolución de problemas
2, el código
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
long long i = 1;
for(i = 1; i <= n; i *= 10)
{
//i表示当前分析的是哪一个数位
int a = n / i, b = n % i;
count = count + (a + 8) / 10 * i + (a % 10 == 1) * (b + 1);
}
return count;
}
};