九位累计可除数——递归解法
九位累计可除数 :它是由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; }