// 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);
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("
");
a[i]=a[i]+1;
}
}
if(s==0) printf( " 没有找到!
");
else printf(" 共以上%d个解。
",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,g);
for(i=1;i<=g;i++)
{ printf(" %d: ",i);
for(d=1;d<=n;d++)
printf("%d",a[i][d]);
printf("
");
}
}
else
{ printf(" 无解!
");return;}
}