金山招聘题目: 编程计算从1到2008080808之间的整数有多少个含有数字7

 

暴力求解,1-2008080808算完估计天都黑了还算不出。从数学思想中,寻找规律是比较常规。用DP思想也挺不错的,按位数长度不同来逐渐填表,不过没去实现。看各位大虾回复中,发现2种挺不错的做法,摘录学习之:

 

(1)           观察10,100,1000,10000得:f(n)=10^(n-1)+f(n-1)*10-f(n-1)=10^(n-1)+f(n-1)*9
                        (1) f(n):10^n中含7的数字的个数 
                        (2) f(n-1):10^(n-1)中含7的数字的个数,因为在n位数中n-1位数可以从零到九,所以乘10 
                        (3) 10^(n-1)代表第n-1位为7的数字的个数 
                        (4) 因为(2) 和(3)中有重复的数,其个数为f(n-),所以减去f(n-1)


 
  1. unsigned long getNumber(n) 
  2. {    
  3.     unsigned count=0; 
  4.     if(n==1) 
  5.         count=1; 
  6.     else 
  7.     { 
  8.         count=f(n-1)*9+10^(n-1); 
  9.     } 
  10.     return count; 
  11. g(2008080808)=2*f(10)+8*f(7)+8*f(7)+8*f(3)+f(1)

 

(2)

  1. #include<algorithm>
  2. int main(void)
  3. {
  4.     int n, nn=1; //统计7
  5.     while (scanf("%d", &n)!=EOF)
  6.     {
  7.         int nlist[16], nb, s=0, t=n, p=0;
  8.         for (nb=0; t>0; ++nb)
  9.         {
  10.             nlist[nb] = t%10;
  11.             if (nlist[nb] > nn)
  12.             {
  13.                 --nlist[nb];
  14.             }
  15.             else if (nlist[nb] == nn)
  16.             {
  17.                 --nlist[nb];
  18.                 for (; p<nb; ++p)
  19.                 {
  20.                     nlist[p] = 8;//因为高位为7, 该数定是含7的数。去之。
  21.                 }
  22.             }
  23.             t /= 10;
  24.         }
  25.         for (--nb; nb>=0; --nb)
  26.         {
  27.             s = s*9 + nlist[nb];
  28.         }
  29.         printf("%d/n", n - s);
  30.     }
  31.     return 0;
  32. }

第二种是9进制的思想。 初始 - 不含7的数 = 含7的数。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值