// n位逐位整除探索 ,c541 #include<stdio.h> void main() { int i,j,n,r,t,s,a[100]; printf(" 逐位整除数n位,请确定n:"); scanf("%d",&n); printf(" 所求%d位逐位整除数:\n",n); for(j=1;j<=100;j++) a[j]=0; t=0;s=0; i=1;a[1]=1; while(a[1]<=9) { if(t==0 && i<n) i++; for(r=0,j=1;j<=i;j++) // 检测i时是否整除i { r=r*10+a[j]; r=r%i; } if(r!=0) { a[i]=a[i]+1;t=1; // 余数r!=0时,a[i]增1,t=1 while(a[i]>9 && i>1) { a[i]=0; i--; // 回溯 a[i]=a[i]+1; } } else t=0; // 余数r=0时,t=0 if(t==0 && i==n) { s++;printf(" %d: ",s); for(j=1;j<=n;j++) printf("%d",a[j]); printf("\n"); a[i]=a[i]+1; } } if(s==0) printf( " 没有找到!\n"); else printf(" 共以上%d个解。\n",s); }
// 递推探索n位逐位整除数,c542 #include<stdio.h> void main() {int d,g,i,j,k,m,n,r, a[3000][30],b[3000][30]; printf(" 请输入逐位整除数的位数n:"); scanf("%d",&n); g=9; // 递推基础:1位时赋初值 for(j=1;j<=g;j++) a[j][1]=j; for(k=2;k<=n;k++) // 递推位数k从2开始递增 { m=0; for(i=1;i<=g;i++) // 枚举g个n-1位逐位整除数 for(j=0;j<=9;j++) // n位数的个位数字为j { a[i][k]=j; for(r=0,d=1;d<=k;d++) // 检测n位数除n的余数r { r=r*10+a[i][d]; r=r%k; } if(r==0) { m++; for(d=1;d<=k;d++) b[m][d]=a[i][d]; // 满足条件的n位数赋值给b数组 } } g=m; // 递推得g个n位逐位整除数 for(i=1;i<=g;i++) for(d=1;d<=k;d++) a[i][d]=b[i][d]; // g个b数组向a数组赋值,准备下步递推 } if(g>0) // 输出n位的个数及每一个数 { printf(" %d位逐位整除数共%4d个:\n",n,g); for(i=1;i<=g;i++) { printf(" %d: ",i); for(d=1;d<=n;d++) printf("%d",a[i][d]); printf("\n"); } } else { printf(" 无解!\n");return;} }