题目:
请将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;
}