读《剑指Offer》有感,记下下面内容以备忘记:
#include <iostream>
using namespace std;
int Numof1ToN(int n)
{
int res = 0;
for (int i = 1;i <= n; ++i)
{
int j = i;
while(j)
{
if(j % 10 == 1)
{
res++;
}
j /= 10;
}
}
return res;
}
int Power(int base, int n)
{
if (n == 0) return 1;
else if (n == 1) return base;
int half = Power(base, n / 2);
return n % 2 == 0? half * half:half * half * base;
}
//思路:21345
// 1- 5, 6-45, 46 - 345, 346-1345, 1346-21345
//拆成5部分:
//每一部分:1)若最高位为1,则firstNum = 除了最高位外的数 + 1 比如:1345 则firstnum = 345 + 1;
// 2)若最高位不为1, 则firstNum = 10^(len - 1)
//除了最高位,其他位上OtherNum = first * (len - 1) * 10^(len - 2);
int Numof1ToNLogN(char * str)
{
if(!str || *str < '0' || *str > '9' || *str == 0)
{
return 0;
}
int first= *str - '0';
int len = strlen(str);
if (len == 1 && first ==0)
{
return 0;
}
if (len == 1&& first > 0)
{
return 1;
}
int numFirst = 0;
if(first > 1)
{
numFirst = Power(10, len - 1);
}
else if (first == 1)
{
numFirst = atoi(str + 1) + 1;
}
int numOther = first * (len - 1) * Power(10, len - 2);
int numRecursin = Numof1ToNLogN(str + 1);
return numFirst + numOther + numRecursin;
}
int main()
{
printf("NUM: %d\n", Numof1ToN(121));
printf("NUMlogn: %d\n", Numof1ToNLogN("121"));
return 0;
}