数字8

不超过N位的正整数中包含有多少数字8?

输入格式
一行1个正整数N,范围[1,16]。

输出格式
一个整数。


  • 一开始思路:反着算出含8的数的个数———— 所有数 - 不含任何8的数:(10^n - 1) - (9^n - 1),但是一个含8数字到底包含几个8,不好确定。

  • 转换思路,按照8出现的次数分开推导:

    • 只含1个8的数:

      C(n,1)->n位数中,选一个当8
      9^(n-1)->剩下n-1位,每一位9种选择
      此时共有1×C(n,1)×9^(n-1) 个8

    • 只含2个8的数:

      C(n,2)×9^(n-2)
      其中每个数都含有2个8,故此时共有2×C(n,2)×9^(n-2)个8

    • 只含i个8的数:

      C(n,i)×9^(n-i)
      其中每个数都含有i个8,故此时共有i×C(n,i)×9^(n-i)个8


#include<bits/stdc++.h>
using namespace std;

long long f(int x) {
    long long t=1;
    for(int i=1;i<=x;i++){
        t*=i;
    }
    return t;
}

long long c(int m, int n) {
    return f(m)/(f(n)*f(m-n));
}

int main() {
    int n;
    cin>>n;
    long long s=0;
    for(int i=1; i<=n; i++) {
        long long C=c(n,i);
        long long x=i*C*pow(9, n-i);
        s+=x;
    }
    cout<<s;
    return 0;
}

posted on 2024-02-02 08:44  可爱楷玩算法  阅读(99)  评论(0)    收藏  举报

导航