位数问题(思路和代码详解)

1313:位数问题

1、题目内容

【题目描述】
在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。

【输入】
读入一个数N。

【输出】
输出有多少个数中有偶数个数字3。

【输入样例】
2
【输出样例】
73

2、解题思路

在解决本问题的时候,大家想到的最简单的方法无疑是将每个数遍历一遍,判断数是否满足题目要求,加以计数,从而得出答案。但是这个方法往往会超时,不太高效。所以我们可以通过采用递推的方式去巧妙的解决问题。
使用两个数组,a[i]用来记录当数位为i时的数中有奇数个3的种类数,b[i]则用来记录当数位为i时的数中有偶数个3的种类数。从而会有递推式a[i]=a[i-1]*9+b[i-1] b[i]=b[i-1]*9+a[i-1] 递推式很容易理解,10个数,一个数为3,其余还有9个数,每次从10个数中选取数时即从这两类数中选,从而有递推式。

3、解题代码

#include<stdio.h>
int main()
{
    int i,j,k,m,n;
    int a[1000];//记录当数位为i时3的个数为奇数的种类数 
    int b[1000];//记录当数位为i时3的个数为偶数的种类数
    a[1]=1;
    b[1]=8;
    scanf("%d",&n);
    for(i=2;i<=n;i++)
    {
        a[i]=(a[i-1]*9+b[i-1])%12345;
        b[i]=(b[i-1]*9+a[i-1])%12345;
    }
    printf("%d",b[n]);
    return 0;
}
点赞