九位累计可除数——递归解法
九位累计可除数 :它是由1—9九位各不相同的数组成的一位九位数 ,它的前两位能被2整除,前三位能被3整除,前N位能被N整除,这个数能被9整除。
这个问题是在翻论坛原来的帖子看到的,觉得挺有意思的,所以拿来做了做。我就抛个砖头,希望可以引出美玉。我是用递归做的,如有错误望指正,也希望各位积极给出更多算法。ps:╮(╯▽╰)╭我写的算法还有点不好理解。。。只有这水平了,各位见谅。
程序代码:#include <stdio.h>
char cNum[9] = {0,0,0,0,1,0,0,0,0}; // 代表1-9个数,被应用的值为1,没有应用的值为0
// 注:五位数要求被5整除,5肯定只有一个位置能放,所以5的位置已经初始化为1了
void PrintNum(long nNum,int n) // nNum:代表测试的数据,n:代表测试的位数
{
//printf("%d,%ld\n",n,nNum);
if(n==9)
{
printf("%ld\n",nNum);
return ;
}
//if(n==1)
//for(int i=2; i<9; i+=2)
//PrintNum(nNum*10+i,2);
if(n==4) // 专门处理5这个特殊值
PrintNum(nNum*10+5,5);
for(int i=0; i<9; i++)
{
if(!cNum[i])
{
cNum[i] = 1;
long temp = nNum*10+i+1;
if(!(temp%(n+1)))
{
PrintNum(temp,n+1);
cNum[i] = 0;
}
else
{
cNum[i] = 0;
continue;
}
}
}
}
int main()
{
printf("<<<<< 九位数累计可除数计算 >>>>>\n");
for(int i=0; i<9; i++)
{
if(!cNum[i])
{
cNum[i] = 1;
PrintNum(i+1,1);
cNum[i] = 0;
}
}
getchar();
return 0;
}








)
)
