题意:给一个数,返回小于这个数的正整数中含1的个数
解法:如果这个数小于等于0,返回0。
如果这个数大于0,我们就得按照每个位来判断。比如数字1159,个位上为1的数就有0001~1151共116个。那么如何判断呢?要根据每位的数字来定,详情见代码吧。先把去掉这个位上的数的所有数都存在一起。代码如下:
int countDigitOne(int n)
{
vector<int> digits,lnumbers;
int s[11]= {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,1000000000};
int i,j,k,t,ans=0,size;
if(n<=0) return 0;
if(n<10&&n>=1) return 1;
k=n;
while(k>0)
{
digits.push_back(k%10);
k=k/10;
}
for(i=0; i<digits.size(); i++)
{
k=1;
t=0;
for(j=0; j<digits.size(); j++)
{
if(i==j) continue;
t=t+digits[j]*k;
k=k*10;
}
lnumbers.push_back(t);
}
for(i=0; i<lnumbers.size()-1; i++)
{
if(digits[i]==0) ans+=lnumbers[i]/s[i]*s[i];
else if(digits[i]==1) ans+=lnumbers[i]+1;
else ans+=lnumbers[i]/s[i]*s[i]+s[i];
}
if(digits[digits.size()-1]==1) ans=ans+lnumbers[digits.size()-1]+1;
else ans+=s[digits.size()-1];
return ans;
}