题目:https://cn.vjudge.net/contest/178832#problem/C
输入1个整数n,计算从1到n各个位上1出现的次数。
思路:如果暴力,肯定是会超时的。所以要从数位上找规律。221看10位上出现1的情况,10- 19,110-119,210-219.
假如212,十位上10 19,110-119,210-212由百位和各位决定。再举些例子便可以发现,3221,十位上 10-19,110-119,210-219.。。1110-1119,1210-1219.。。。3210-3219.
pre*10+af+1;n>2时。(pre+1)*10,n==0,pre*10.
#include<iostream>
using namespace std;
int solve(int n)
{
int i = 1, cur, be, af,ans=0;
while (n / i)
{
cur = n / i % 10;//当前位的数字
be = n / (i * 10);该位之前的数字
af = n - n / i*i;
if (cur > 1)
ans += (be + 1) * i;
else if (cur < 1)
ans += be * i;
else
ans += be * i + af + 1;
i = i * 10;
}
return ans;
}
int main()
{
int n;
while (cin >> n)
{
cout << solve(n) << endl;
}
return 0;
}