一、 问题描述
编程输出一个特别的数,该数是一个由1~9组成的9位数,每个数字只能出现一次,且这个9位数由高位到低位前i位能被i整除。
二、算法思想
- 创建一个长度为9的数组,用于存放1~9这9个数字。
- 使用回溯算法,从第一位开始进行尝试。
- 对于当前位,从1~9中选择一个数字,判断该数字是否已经被使用过,如果已经被使用过则跳过该数字。
- 判断从高位到当前位的数字组成的数是否能被当前位整除,如果不能则跳过该数字。
- 如果当前位是最后一位,则说明找到了一个符合条件的数,输出该数。
- 如果当前位不是最后一位,则递归调用自身,对下一位进行尝试。
- 在递归调用结束后,需要将当前数字设置为未使用状态,以便后续的尝试。
三、代码实现
#include <stdio.h>
int main(void)
{
long i[9];
long j, n;
i[4] = 5;
for (i[0] = 1; i[0] < 10; i[0] += 2)
{
for (i[1] = 2; i[1] < 9; i[1] += 2)
{
for (i[2] = 1; i[2] < 10; i[2] += 2)
{
if (i[2] == i[0])
continue;
for (i[3] = 2; i[3] < 9; i[3] += 2)
{
if (i[3] == i[1])
continue;
for (i[5] = 2; i[5] < 9; i[5] += 2)
{
if (i[5] == i[3] || i[5] == i[1])
continue;
for (i[6] = 1; i[6] < 10; i[6] += 2)
{
if (i[6] == i[4] || i[6] == i[2] || i[6] == i[0])
continue;
for (i[7] = 2; i[7] < 9; i[7] += 2)
{
if (i[7] == i[5] || i[7] == i[3] || i[7] == i[1])
continue;
for (i[8] = 1; i[8] < 10; i[8] += 2)
{
if (i[8] == i[6] || i[8] == i[4] || i[8] == i[2] || i[8] == i[0])
continue;
n = 0;
for (j = 0; j < 9; j++)
{
n = n * 10 + i[j];
if (n % (j + 1) != 0)
break;
}
if (j == 9)
printf("%ld\n", n);
}
}
}
}
}
}
}
}
}
执行结果
结语
努力不是为了逃避平庸
而是为了追求内心的富足与安宁
!!!