题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009
题目:给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
这题做了半天,脑袋一团浆糊。找找规律最后胡搞一通。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int d[11],a[11];
int dfs(int n,int len, int t)
{
if(n==a[len]) return d[len-1];
if(n==0) return 0;
if(len==1) return 1;
if(t==0)
{
return dfs(n,len-1,n/a[len-1]);
}
if(t==1)
{
return d[len-1]+dfs(n-a[len],len-1,(n-a[len])/a[len-1])+n-a[len];
}
if(t==2)
{
return dfs(a[len]*2-1,len,1)+dfs(n-a[len]*2,len-1,(n-a[len]*2)/a[len-1]);
}
if(t>2)
{
n-=a[len];
return dfs(n,len,t-1)+d[len-1]-1;
}
}
int main()
{
d[0]=1;
int t=1,n;
a[0]=1;
for(int i=1;i<10;i++)
{
d[i]=i*t+1;
a[i]=t;
t*=10;
}
while(~scanf("%d",&n)){
t=n;
int len=1;
while(t/10)
{
len++;
t/=10;
}
cout<<dfs(n,len,t)<<endl;}
}