首先,这道题求所有包含49的数,其实就是 总数-所有不包含49的数,求不包含49的数就是像 不要62一样做就好。
注意 1:中间过程可能超long long的必须加ll,这个问题任何时候都要关注,要形成稳定的条件反射!!
2:其实求所有包含49的数也很简但,就是上一题13的问题一样,多记录一个参数,多一维就可以
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll; ll n; int T,li[25]; ll f[25][2]; ll dfs(int i,bool state,bool limit) { if (i==0) return 1; if (!limit && f[i][state]) return f[i][state]; int up=limit ? li[i]:9; ll ans=0; for (int j=0;j<=up;j++) { if (state&&j==9) continue; ans+=dfs(i-1,j==4?true:false,limit&&j==up?true:false); } if (!limit) f[i][state]=ans; return ans; } void work(ll n) { memset(f,0,sizeof(f)); memset(li,0,sizeof(li)); int tot=0; ll m=n; while(n) { li[++tot]=n%10; n=n/10; } printf("%lld\n",m-(dfs(tot,false,true)-1)); //因为要处理0的情况,所以-1,0在这里不算一个不含49的数 } int main() { scanf("%d",&T); while (T--) { scanf("%lld",&n); work(n); } return 0; }
