一个十位数由0-9数字组成并前N位被N整除

题目:

请将0123456789十个数字以特定的顺序排列,组成一个10位数ABCDEFGHIJ(每个数字只能使用一次),使得:
1.第一位数字组成的整数可以被1整除
2.第一、二位数字组成的整数可以被2整除
3.第一、二、三位数字组成的整数可以被3整除
4.第一、二、三、四位数字组成的整数可以被4整除
......
10.第一、二、三...十位数字组成的整数可以被10整除

 

分析:

E=5(被5整除),J=0(被10整除),则ABCD5FGHI0

偶数位一定是偶数则BDFH={2,4,6,8},奇数位一定是奇数则ACGI={1,3,7,9};

ABCD被4整除,则(10C+D)被4整除,排除D={4,8}的情况后,D={2,6};同样,ABCD5FGH被8整除,则(10G+H)能被4整除,H={2,6};故DH={2,6},BF={4,8};

ABCD5F被6整除,ABC被3整除,则(100D+50+F)能被3整除,结合D={2,6},F={4,8},可得DEF={258,654};

当DEF=258时,H=6,B=4,则A4C258G6I0.

  由被8整除得8G6被8整除,结合G={1,3,7,9}得,G={1,9}

  当G=1时,AC={3,7,9},无法使A4C被3整除。

  当G=9时,AC={1,3,7};147、741、143、341能使A4C被3整除,但前7位都不能被7整除。

  DEF=258被否决,故:

DEF必然等于654,H=2,B=8,则A8C654G2I0.

由被8整除得4G2被8整除,结合G={1,3,7,9}得,G={3,7}

  当G=3时,AC={1,7,9};189、981、789、987能使A8C被3整除,但前7位都不能被7整除。

  当G=7时,AC={1,3,9};183、381、189、981能使A8C被3整除,唯有381能被7整除,故得唯一解3816547290

 

程序求解:

基本思路就是回溯法,用经典的回溯法模板写。

int a[10];//结果数组

int Judge(int i);//判断第i位
void Show();//输出结果

int main()
{
   int i = 1;
  a[1] = 1; 
  while (i>=1)       
 {
    while (a[i]<=9)     
   {
      if (Judge(i))    
     {
        if (i==9&& Judge(9)) 
       { Show();  a[i]++;}
       else     
       { i++;  a[i]=1;}
     }
     else a[i]++;    
   }
   a[i] = 1;
   a[i-1]++;
   i--;       
 }
 return 0;
}

int Judge(inti)      
{
   int k;
   long sum;
 
   if (i==1) return 1;
 
   sum=0;
   for (k=1; k<=i; k++)
  {
     sum = sum*10 + a[k];
     if (sum%k != 0)  return 0;
     if (k-1>0 &&a[k-1]==a[i])  return 0;
     if (a[k]<1 || a[k]>9)  return 0;
  }
  return 1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值