24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1300  |  回复: 15
本帖产生 2 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

sxlion811

金虫 (正式写手)

★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
余泽成(金币+2):谢谢详细分析! 2010-04-24 20:45
wangen994(金币+2, 程序强帖+1):辛苦了,请在后面跟帖,参与活动奖励http://emuch.net/bbs/viewthread.php?tid=1973306&fpage=1 2010-04-27 09:58
还是说说算法思想吧。

虽然不同的软件实现的具体方式不一样,但是算法思想是同样的。

1,构建全排列的公式
2,将公式一一计算出来。

难点在于构建全排列的公式算法, 由于sql两表连接时可以用到笛卡尔乘积来实现全排列,因此这个问题得到了解决。

也许不同的语言有着不同实现全排列的方式,但是手动循环一个一个的去拼公式是个太原始太费劲的方法,这个是一般不会考虑的。

大家还知道哪些软件可以轻松实现全排列吗?

[ Last edited by sxlion811 on 2010-4-24 at 18:35 ]
开心努力一辈子
10楼2010-04-24 18:24:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

holmescn

金虫 (正式写手)

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
wangen994(金币+10):辛苦了,holmescn专家 2010-04-27 20:40
wangen994(程序强帖+1):辛苦了,呵呵 2010-05-09 21:28:34
经过我一个下午加半个晚上(大约是下午4点到凌晨2点)的不间断思考,终于用C语言实现了这个算法。主要是怎么排列是个麻烦的问题。一直在演算。终于在要放弃的时候想到了递归的终止条件。代码没有注释。大家凑合围观一下。不明白的地方可以讨论。谢谢。
CODE:
#include
#include
#include
#include
#include

struct node
{
    int num;
    char op;
    int digits;
};

int Calc(struct node* p, int n);
int myAtoi(char* begin, int length);
int Find(struct node* p, int n, int sum);
bool genNumber(struct node* p, int n, int r);
void toNumbers(struct node* p, int n);
void genOperator(struct node* p, int n, int flag);
void Print(struct node* p, int n);

char numbers[]="123456789";

int myAtoi(char* begin, int length)
{
    int result=0;
    char* r=malloc(length+1);
    r=strncpy(r,begin,length);
    r[length+1]=0;
    result=atoi(r);
    free(r);
    return result;
}

void toNumbers(struct node* p, int n)
{
    char* q=&numbers[0];

    for(int i=0;i     {
        p[i].num=myAtoi(q,p[i].digits);
        q+=p[i].digits;
    }
}

int Calc(struct node* p, int n)
{
    int sum=0;
    sum=p[0].num;
    if(p[0].op=='-')
        sum=0-sum;

    for(int i=1;i     {
        switch(p[i].op)
        {
            case '+':
                sum+=p[i].num;
                break;
            case '-':
                sum-=p[i].num;
                break;
            default:
                break;
        }
    }

    return sum;
}

bool genNumber(struct node* p, int n, int r)
{
    if(r<0)
    {
        p[n+2].digits++;
        p[n+1].digits=0;
        p[n].digits=0;
        return false;
    }

    if(n==0)
    {
        if(r==0)
            return false;
        p[n].digits=r;
        return true;
    }
   
    if(n==1)
    {
        p[n].digits++;
    }   
   
    if(p[n].digits==0)
    {
        p[n].digits=1;
    }
   
    genNumber(p, n-1, r-p[n].digits);
}

void genOperator(struct node* p, int n, int flag)
{   
    for(int i=0;i     {
        switch(flag & 1)
        {
            case 0:
                p[i].op='+';
                break;
            case 1:
                p[i].op='-';
                break;
        }
        flag=flag>>1;
    }

}

int Find(struct node* p, int n, int sum)
{
    int total=0;
    int res=0;
    memset(p, 0, 9*sizeof(struct node));
   
    while(p[n].digits<9)
    {
        if(genNumber(p, n, 9)==false)
            continue;
   
        toNumbers(p, n);
        for(int j=0;j         {   
            genOperator(p, n, j);
            res=Calc(p, n);
            
            if(res==sum)
            {
                for(int k=0;k                 {
                    printf("%c%d",p[k].op,p[k].num);
                }
                printf("=%d\n",res);
            
                total++;
            }
        }
    }

    return total;
}

int main()      
{               
    int sum;
    int total=0;
    struct node p[9];
    memset(p, 0, 9*sizeof(struct node));
   
    printf("Input the sum: ");
    scanf("%d",&sum);

    puts("Results:");

    for(int i=1;i<10;i++)
        total+=Find(p, i, sum);

    printf("Total is %d\n", total);
}

PS:怎么搞成CODE的样子啊?这个我不会啊。达人们教我一下,我再好好排下版。

[ Last edited by wangen994 on 2010-4-27 at 20:38 ]
15楼2010-04-27 10:29:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zhliye 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见