#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
string data;
char str[256];
sprintf(str, "%d", n);
data = str;
return NumberOf1(data);
}
int NumberOf1(const string &data)
{
if (data.size() == 0 || data.front() < '0' || data.back() > '9' || data.front() == '\n')
{
return 0;
}
if (data.size() == 1 && (data.front() - '0') == 0)//'0'
{
return 0;
}
if (data.size() == 1 && (data.front() - '0') > 0)//'1','2',...,'9'
{
return 1;
}
int numfirstDigit = 0;
if (data.front() == '1')//两位数以上,最高位为1
{
numfirstDigit = atoi(data.c_str() + 1) + 1;
}
else
{
if (data.front() > '1')//两位数以上,最高位是2,3,...,9
{
numfirstDigit = PowerBase10(data.size() - 1);
}
}
int numotherDigit = (data.front() - '0') * (data.size() - 1) * PowerBase10(data.size() - 2);//去掉最高位,后面的按全排列完成
int numRecursive = NumberOf1(string(data.c_str() + 1)); //次高位变成最高位从新计算
return numfirstDigit + numotherDigit + numRecursive;
}
int PowerBase10(unsigned int n)
{
int result = 1;
for (unsigned int i = 0; i < n; i++)
{
result *= 10;
}
return result;
}
};
int main(void) {
int value;
Solution s;
while (scanf("%d", &value) != EOF)
{
printf("%d\n", s.NumberOf1Between1AndN_Solution(value));
}
return 0;
}
计算1到n的数中1出现的次数
最新推荐文章于 2020-10-30 22:10:21 发布