方法很简单..统计起来比较蛋疼... WA得想吐..参考了别人的代码才过的 ...

    特别注意的是当前数字前面几位已经有49出现的情况....

    

Program:

#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#define ll unsigned long long
#define oo 1000000007
using namespace std;
ll dp[23][3];
void pre()
{
int i,j,k;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for (i=1;i<=22;i++)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];//长度为i的数最且不含49的个数
dp[i][1]=dp[i-1][0];//长度为i的数最高位为9且不含49的个数
dp[i][2]=10*dp[i-1][2]+dp[i-1][1];// 长度为i的数包含的49个数
}
return;
}
ll getans(ll n)
{
ll p,ans,l,s[22];
bool f=false;
l=0;
s[0]=0;
while (n)
{
s[++l]=n%10;
n/=10;
}
ans=0;
for(p=l;p>=1;p--)
{
ans+=dp[p-1][2]*s[p];
if(f)
ans+=dp[p-1][0]*s[p];
else
if(s[p]>4) ans+=dp[p-1][1];
if(s[p+1]==4 && s[p]==9) f=true;
}
return ans;
}
int main()
{
int T;
ll n;
scanf("%d",&T);
pre();
while (T--)
{
cin>>n;
n++;
cout<<getans(n)<<endl;
}
return 0;
}