zoukankan      html  css  js  c++  java
  • hdu2089_不要62

            不要62

    题目大意:给你一个区间,算出该区间里不含62或4的数的个数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

     1 /*
     2 // 暴力就可以过了。。。
     3 #include<stdio.h>
     4 #define N 1000000
     5 int sum[N];
     6 bool fun(int x)
     7 {
     8   bool flag=0;
     9   while(x)
    10   {
    11     int tmp=x%10;
    12     if(tmp==4) return 0;
    13     else if(tmp==2) flag=1;
    14     else if(tmp==6&&flag==1) return 0;
    15     else flag=0;
    16     x/=10;
    17   }
    18   return 1;
    19 }
    20 void Init()
    21 {
    22   sum[0]=0;
    23   for(int i=1;i<N;i++)
    24   {
    25     if(fun(i)==1) sum[i]=sum[i-1]+1;
    26     else sum[i]=sum[i-1];
    27   }
    28 }
    29 int main()
    30 {
    31   Init();
    32   int n,m;
    33   while(scanf("%d%d",&n,&m)!=EOF)
    34   {
    35     if(n==0&&m==0) break;
    36     printf("%d
    ",sum[m]-sum[n-1]);
    37   }
    38   return 0;
    39 }
    40 */
    41 #include<stdio.h>
    42 int dp[10][3]={0};
    43 //dp[i][0] 数的长度为 i ,且不含不吉利数字 ( 不含62和4 )
    44 //dp[i][1] 数的长度为 i ,不含不吉利数字且最高位为2
    45 //dp[i][2] 数的长度为 i ,存在不吉利数字
    46 
    47 void Init()
    48 {
    49   dp[0][0]=1;
    50   for(int i=1;i<7;i++)
    51   {
    52     // i位的不含不吉利数字的数的个数为 i-1位的乘以 9 (去掉4),再减去 i-1 位时吉利的且最高位为2的数的个数(6)
    53     dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
    54     // i位的最高位为2的吉利数个数和i-1位的吉利数的个数相同
    55     dp[i][1]=dp[i-1][0];
    56     // i位的不吉利数为 i-1位不吉利数的个数*10 + i-1位吉利数的个数(4)+ i-1位最高位为2的吉利数的个数
    57     dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];
    58   }
    59 }
    60 int solve(int x)
    61 {
    62   int c[10],co=1,n=x,s=0; //s为不吉利的数的个数
    63   while(x)
    64   {
    65     c[co++]=x%10;
    66     x/=10;
    67   }
    68   c[co]=0;
    69   bool flag=0;
    70   // 从最高位往后推
    71   for(int i=co-1;i>0;i--)
    72   {
    73     s+=c[i]*dp[i-1][2];  //后面造成的不吉利数
    74     if(flag==1)          //前几位已经出现了不吉利现象,也就是说后面不管是啥,都是不吉利的。
    75     {
    76       s+=c[i]*dp[i-1][0];
    77       continue;
    78     }
    79     if(c[i]>4)           //第i位为4造成的不吉利数
    80       s+=dp[i-1][0];
    81     if(c[i+1]==6&&c[i]>2)//第i+1位为6 第i位为2造成的不吉利数
    82       s+=dp[i][1];
    83     if(c[i]>6)           //第i位为6造成的不吉利数
    84       s+=dp[i-1][1];
    85     if(c[i]==4||c[i+1]==6&&c[i]==2) flag=1;
    86   }
    87   return n-s;
    88 }
    89 int main()
    90 {
    91   Init();
    92   int l,r;
    93   while(scanf("%d%d",&l,&r)!=EOF)
    94   {
    95     if(l==0&&r==0) break;
    96     printf("%d
    ",solve(r+1)-solve(l));
    97   }
    98   return 0;
    99 }
  • 相关阅读:
    ReverseFind的用法 ; 查找字符中最后一个字符
    sprintf_s() 、sprintf()和printf()区别和用法
    CString/string 区别及其转化
    CC++中strcat()函数
    C++中cstring.h和string.h的区别
    vs中CString的用法,以及所需的头文件
    头文件afx.h作用
    sprintf_s函数用法
    C++ format 函数
    C/C++ typedef用法
  • 原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/4908909.html
Copyright © 2011-2022 走看看