24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 1292  |  回复: 15
本帖产生 2 个 程序强帖 ,点击这里进行查看

zhliye

新虫 (初入文坛)

引用回帖:
Originally posted by sxlion811 at 2010-04-24 16:36:32:
哈哈,做出来了,不过不是我做出来的,一种有3249种结果。

用sas做出来的,不过我觉得用SQL语言也可以做出来的。

附:[url]http://www.mysas.net/forum/viewtopic.php?f=4&t=6313&p=21596#p21596[/ ...

还没看懂哈哈,不过很感谢了。
我要吃青菜。
11楼2010-04-26 14:45:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhliye

新虫 (初入文坛)

引用回帖:
Originally posted by sxlion811 at 2010-04-24 18:24:52:
还是说说算法思想吧。

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

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

难点在于构建全排列的公式算法, 由于sql两表连接时可以用到笛卡尔 ...

呵呵,找的就是实现排列的算法啊,用软件不没意思了
我要吃青菜。
12楼2010-04-26 14:46:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhliye

新虫 (初入文坛)

引用回帖:
Originally posted by holmescn at 2010-04-22 12:53:49:
2楼正解
用树的生成算法。数字放到叶子上,节点是算符。类似表达式的解析树。有空可以玩一下。

PS:最近发算法贴的挺多,有意思。

其实最近学《计算数学特论》难题太多了哈。
老师出了7个题,据说这个是最简单的,
我要吃青菜。
13楼2010-04-26 14:48:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhliye

新虫 (初入文坛)

引用回帖:
Originally posted by sxlion811 at 2010-04-24 16:36:32:
哈哈,做出来了,不过不是我做出来的,一种有3249种结果。

用sas做出来的,不过我觉得用SQL语言也可以做出来的。

附:[url]http://www.mysas.net/forum/viewtopic.php?f=4&t=6313&p=21596#p21596[/ ...

不错,把符合和数字结合作为整体也是一种思想,受教了
我要吃青菜。
14楼2010-04-26 14:59:17
已阅   回复此楼   关注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的回帖

wangen994

荣誉版主 (著名写手)

将军


小木虫(金币+0.5):给个红包,谢谢回帖交流
引用回帖:
Originally posted by holmescn at 2010-04-27 10:29:46:
经过我一个下午加半个晚上(大约是下午4点到凌晨2点)的不间断思考,终于用C语言实现了这个算法。主要是怎么排列是个麻烦的问题。一直在演算。终于在要放弃的时候想到了递归的终止条件。代码没有注释。大家凑合围 ...

辛苦了
16楼2010-04-27 20:39:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zhliye 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见