对于给定的数abcd,分三种情况。
(1)最后一位数d出现1的次数,若d==0,则出现的次数为abc次;若d>=1,则个位出现1的次数为abc+1。
(2)首位数a出现1的次数,若d==1,则出现1的次数为bcd+1此,若d>1,则出现1的次数为10^(数的个数-1)。
(3)除首尾(b|c)出现1的次数,这里已b为说明,若b==0,则出现1的次数为a*100;若b==1,则出现1的次数为a*100+cd+1;若b>1,则出现1的次数为(a+1)*100。
全部相加,即得结果。
AC代码:
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<cmath>
#define inf 26*26*26*10+5
using namespace std;
int main()
{
string s;
cin>>s;
int sum=0;
int d=1;
//cout<<s.size()<<endl;
for(int i=0;i<s.size();i++)
{
sum*=10;
sum+=s[i]-'0';
}
//cout<<sum<<endl;
int ans=0;
int ff;
for(int i=s.size()-1;i>=0;i--)
{
if(i==s.size()-1)
{
ff=1;
}
else
{
ff*=10;
}
if(i==s.size()-1)
{
if(s[i]=='0')
{
ans+=sum/10;
}
else
{
ans+=sum/10+1;
//cout<<ans<<endl;
}
}
else if(i==0)
{
if(s[i]=='1')
{
ans+=sum-ff+1;
//cout<<ans<<endl;
}
else
{
ans+=ff;
// cout<<ans<<endl;
}
}
else
{
if(s[i]=='0')
{
ans+=sum/(ff*10)*ff;
}
else if(s[i]=='1')
{
ans+=sum/(ff*10)*ff+sum%ff+1;
}
else
{
ans+=(sum/(ff*10)+1)*ff;
}
//cout<<ans<<endl;
}
}
cout<<ans<<endl;
}