题意
The task is simple: given any positive integer N, you are supposed to count the total number of 1’s in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1’s in 1, 10, 11, and 12.
输入格式
Each input file contains one test case which gives the positive N (<=230).
输出格式
For each test case, print the number of 1’s in one line.
输入样例
12
输出样例
5
思路
如果通过从1数到n一个个来枚举的话,肯定超时。这里可以通过特殊数字找规律
比如令n=30710
1)考虑个位可能出现1的个数:
3071∗100
2)考虑十位可能出现1的个数:
307∗101+1
3)考虑百位可能出现1的个数:
(30+1)∗102
4)考虑千位可能出现1的个数:
3∗103
5)考虑万位可能出现1的个数:
(0+1)∗104
即对每一位分别考虑 等于1
,大于1
,小于1
三种情况
代码
/**
* @tag PAT_A_1096
* @authors R11happy (xushuai100@126.com)
* @date 2017-2-19 14:32-15:12
* @version 1.0
* @Language C++
* @Ranking 1445/903
* @function null
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main(int argc, char const *argv[])
{
LL N;
scanf("%lld", &N);
int maxLen = 0;
int index = 0;
LL sqr = (LL)sqrt(1.0*N);
for(int i = 2; i<=sqr; i++)
{
int curLen = 0;
LL tmp = i;
if(N % i == 0)
{
curLen++;
for(int j = i+1; j<=sqr; j++)
{
tmp*=j;
if(N % tmp==0) curLen++;
else break;
}
if(curLen > maxLen)
{
index = i;
maxLen = curLen;
}
}
}
if(maxLen == 0)
{
printf("1\n");
printf("%lld\n",N );
}
else
{
printf("%d\n",maxLen );
for(int i = 0; i<maxLen-1; i++)
{
printf("%d*", index+i);
}
printf("%d\n",index+maxLen-1 );
}
return 0;
}
收获
如果思路一时间看不太出来,可以考虑先找个特殊的数,一点一点找规律来做。