回 帖 发 新 帖 刷新版面

主题:急求数据结构的问题,哪位大虾想来挑战一下

123456789=100
在前面添加“+”或者“-”使等式满足
要求时间复杂度最小

求救了~~~~~~~~~~

回复列表 (共5个回复)

沙发

大家帮忙解答一下啊

后天就要验收了

好急~~~~~~~~

板凳

有人会不???

3 楼

运行一下看看:)
方法是把所有的符号组合都试一下,一共3^9=19683次,复杂度最高的那种吧。这个是用opt[]数组表示的符号组合,0表示无符号,1减,2加。比如说opt[]={0,0,0,2,1,2,0,1,0},就表示123+4-5+67-89。
如何遍历所有的符号组合呢?是把它看成9位的3进制数,每次加1,一共加19683次就行了。

#include <stdio.h>

char num[9] = {1,2,3,4,5,6,7,8,9};
char opt[9];

void addone (void)
{
    int i;

    for (i = 1; i < 9; ++i)
        if (++opt[i] >= 3)
            opt[i] = 0;
        else break;
}

void showopt (void)
{
    int i;

    for (i = 0; i < 9; ++i)
        printf ("%d", opt[i]);
    printf ("\n");
}

int compute (void)
{
    static char opstk[10];
    static long numstk[10];
    int top = 0, i;
    long n = 0, n2;

    for (i = 0; i < 9; ++i) {
        if (opt[i] == 0) {
            n *= 10;
            n += (long)num[i];
        }
        else {
            numstk[top] = n;
            opstk[top] = opt[i];
            top++;
            n = num[i];
        }
    }
    n2 = n;
    numstk[top] = n;
    n = numstk[0];

    for (i = 0; i < top; ++i) {
        if (opstk[i] == 1)
            n -= numstk[i+1];
        else
            n += numstk[i+1];
    }

    if (n == 100) {
        for (i = 0; i < top; ++i) {
            printf ("%d", numstk[i]);
            if (opstk[i] == 1)
                printf ("-");
            else printf ("+");
        }
        printf ("%d=100\n", n2);
        showopt ();

        return 1;
    }
    else return 0;
}

int main (void)
{
    int i;

    for (i = 0; i < 19683; ++i) {
        compute ();
        addone ();
    }

    return 0;
}

4 楼

这里是所有的结果:
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222

5 楼

不好意思,应该是8位的3进制数~~ 19683改成6561。可以看到结果都重复了,应该只有11个解。

我来回复

您尚未登录,请登录后再回复。点此登录或注册