位数问题
问题描述
在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。
INPUT
输入一个数N(1<=N<=1000),输入以0结束。
OUTPUT
对于每一个N输出有多少个数中有偶数个数字3。
Sample Input
2
0
Sample Output
73
如果n位数中有偶数个3,新增一个数位为3,则n+1位数中有奇数个3
如果n位数中有偶数个3,新增一个数位为非3,则n+1位数中有偶数个3
如果n位数中有奇数个3,新增一个数位为3,则n+1位数中有偶数个3
如果n位数中有奇数个3,新增一个数位为非3,则n+1位数中有奇数个3
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int a[n+1],b[n+1];//a[i]表示i位数字中由偶数个3,b[i]表示i位数字中由奇数个3,
a[1]=9;b[1]=1;
for(i=2;i<=n;i++){
a[2]=a[1]*9+b[1];
b[2]=b[1]*9+a[1];
if(i<n-1){//滚动数组
a[1]=a[2];
b[1]=b[2];
}
}
if(n==1){
printf("%d",a[1]);
}
else printf("%d",a[2]-a[1]); //减去开头是0的
}
方二:
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int a[n+1],b[n+1];//a[i]表示i位数字中由偶数个3,b[i]表示i位数字中由奇数个3,
a[0]=0;
a[1]=9;b[1]=1;
for(i=2;i<=n;i++){//滚动数组
a[i%2]=a[(i-1)%2]*9+b[(i-1)%2];
b[i%2]=b[(i-1)%2]*9+a[(i-1)%2];
}
printf("%d",a[n%2]-a[(n-1)%2]); //减去开头是0的
}