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;
}