#include<stdio.h> #define N 1000 #define M 3000 void hmove(int arr[]) { int i; for(i=M;i>1;i--) { arr[i]=arr[i-2]; } arr[0]=0; arr[1]=0; } void move(int arr[]) { int i; for(i=M;i>0;i--) { arr[i]=arr[i-1]; } arr[0]=0; } void sum(int a[],int b[]) { int i,c; int flag = 0; for(i=0;i<M;i++) { c=a[i]+b[i]+flag; if(c>9) { a[i]=c%10; flag=c/10; } else { a[i]=c; flag=0; } } } void cheng(int arr[],int j) { int i,flag=0,c; for(i=0;i<M;i++) { c=j*arr[i]+flag; if(c>9) { arr[i]=c%10; flag=c/10; } else { arr[i]=c; flag=0; } } } int main() { int i=N,j,a[M],b[M],c[M]; for(i=0;i<M;i++) //初始化数组,使标记值都是-1 { a[i]=0; //存储全部 乘积以及个位乘积 b[i]=0; //存储十位乘积 c[i]=0; } a[0]=0;a[1]=0;a[2]=0;a[3]=1; b[0]=0;b[1]=0;b[2]=0;b[3]=1; c[0]=0;c[1]=0;c[2]=0;c[3]=1; int x,y,z,flag=0; for(i=999;i>0;i--) { if(i<100) { x=i%10; y=i/10; cheng(b,x); cheng(a,y); move(a); sum(a,b); for(j=0;j<M;j++) { b[j]=a[j];} } else { x=i%10; z=i/100; y=(i-z*100)/10; cheng(b,y); move(a); sum(a,b); cheng(c,z); hmove(c); sum(c,a); for(j=0;j<M;j++) { b[j]=c[j]; a[j]=c[j]; } } } for(i=0;i<M;i++) //循环数出2的个数 {if(a[i]==2) flag++; } printf("有%d个2",flag); }