逐位整除数


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

 

posted on 2017-12-06 23:45  小星_log  阅读(573)  评论(0编辑  收藏  举报