24小时热门版块排行榜    

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

zhliye

新虫 (初入文坛)

[交流] 【求助】小町算编程【已完成】已有6人参与

从1到9的数字序列,要求:不改变数字顺序;在数字中添加+-号,得一固定数值;
比如100=123+45-67+8—9
            =—1+2—3+4+5+6+78+9
           =123 +4—5+67—89
     。。。。。。。
等于100的话共有12种算法,
要求编程求等于固定数值的算法的数目。
比如值等于1的有43种算法,等于2的有18中算法,等于99的有25中算法。。。。等于100的有12中算法。

PS;最好用C语言,SQL类的话,不够普通呵呵,感谢各位参与

[ Last edited by wangen994 on 2010-4-27 at 09:59 ]
回复此楼
我要吃青菜。
已阅   回复此楼   关注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的回帖
查看全部 16 个回答

hakekill

木虫 (小有名气)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
resonant(金币+1):有方法不妨共享,即便以前意义上慢,现在CPU\GPU还是运算速度很快的。何况还有超强的服务器,cluster :-) 2010-04-21 17:29
这个不知道在数学上有没有求解方法

我只知道用枚举可以算,不过这个太慢
2楼2010-04-21 17:00:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

phychemlxd

金虫 (小有名气)

★ ★
resonant(金币+1):感谢交流:-) 2010-04-21 18:26
wangen994(金币+1):活动期间额外奖励 2010-04-27 09:59
也许可以考虑树的生成
修.齐.治.平
3楼2010-04-21 18:06:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhliye

新虫 (初入文坛)

引用回帖:
Originally posted by hakekill at 2010-04-21 17:00:53:
这个不知道在数学上有没有求解方法

我只知道用枚举可以算,不过这个太慢

枚举是最基本和可行的思想,但是实现起来不那么容易,要用排列组合,这个不知道怎么把所有可能的排列组合弄出来,共有3的9此方种可能,没想出来怎么用程序实现。
我要吃青菜。
4楼2010-04-22 09:43:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见