| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 535 人关注过本帖, 2 人收藏
标题:九位累计可除数——递归解法
只看楼主 加入收藏
蓝色药剂
Rank: 4
等 级:业余侠客
帖 子:43
专家分:204
注 册:2007-11-24
结帖率:100%
收藏(2)
 问题点数:0 回复次数:3 
九位累计可除数——递归解法
九位累计可除数 :

它是由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;
}


搜索更多相关主题的帖子: 递归 解法 
2009-10-26 19:23
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
2009-10-26 20:41
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
我不想用数组来处理,直接用数字算,但那个算法不适合算多位数(光是外层for循环就要算9亿次
仅供参考吧。为了适合计算机处理,改成处理3位数了
/*求3位互不相等的数字,满足前一位能被1整除,前二位能被2整除,前三位能被3整除*/
程序代码:
main() 
{ 
    int p; 
    int i,n,flag,x,y,z; 
    for(p=999;p>=100;p--) 
        { 
            flag=1; 
            x=p/100;y=p/10%10;z=p%10; 
            for(n=1;n<=3;n++) 
            { 
                switch(n) 
                { 
                    case 1:i=100;break; 
                    case 2:i=10;break; 
                    case 3:i=1;break; 
                } 
                if(p/i%n!=0) {flag=0;break;} 
                if(!(x!=y&&y!=z&&x!=z)) {flag=0;break;} 
            } 
            if(flag==1) printf("%d\t",p); 
        } 
    getch(); 
}
期待高手给出9位数的算法(不用数组且算法简洁哟

我可好玩啦...不信你玩玩^_^
2009-10-26 23:09
蓝色药剂
Rank: 4
等 级:业余侠客
帖 子:43
专家分:204
注 册:2007-11-24
收藏
得分:0 
回复 2楼 godbless
呵呵,原来论坛里面有的啊,是我没找到呢,哈哈,谢了
2009-10-27 08:58
快速回复:九位累计可除数——递归解法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026831 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved