回 帖 发 新 帖 刷新版面

主题:小女子有个问题请问各位高手???

小女子初学程序设计,目前只是学完了C的三大结构和基本的数组、函数知识。现有一题不知其解,望各位高手不吝指教!
题:在1 2 3 4 5 6 7 8 9=15  在1-9中加上加号或减号使之等式成立。
请给出C的详解(虽然我知道是用枚举,但不知其详细解法)。[em10]

回复列表 (共11个回复)

沙发

设定一个数组a[8],a[0]---1和2之间的符号,a[1]---2和3之间的符号,类推。。。
a[0..7]初始依次是{0,0,0,0,0,0,0,0},按照二进制的加法最后得到{1,1,1,1,1,1,1,1},每个数字表示对应数字键的符号,1---加号,0---减号,每得到一个数组就做一遍,do you understand?

板凳

有点眉目了,但我试了几次还是在细节上无法实现。请给出全代码,OK???

3 楼

你是学c的?

4 楼

是要给出所有解?

5 楼

我是选用C的,据说转其它语言如Java比较容易一点。请知道这道题解的发帖相助???[em18]

6 楼

我写了一个,没有调试,我是用pascal的,没有装c的工具,你自己调吧
可能会有很多错误
#include <stdio.h>

int a[8],b[9];


void work()
{
    int l,i,temp,j,k;
    for(i=0;i<256;i++)  //0---255对应00000000---11111111
    {
        temp=b[0];
        for(j=0;j<8;i++)
        {
            if (a[j]==0)
               temp=temp-b[j+1];
            else
            if (a[j]==1)
               temp=temp+b[j+1];
        }
        if (temp==15)  //结果正确输出算式
        {
            for (k=0;k<8;k++)
            {
                printf("%d",b[k]);
                if (a[k]==0)
                   printf("-");
                else
                    if (a[k]==1)
                        printf("+");
            }
            printf("%d=15\n",b[8]);
        }

        l=0;   //从这里到do-while是实现符号位的转变
        a[l]=a[l]+1;
        do
        {
            if (a[l]>1)
            {
                a[l]=a[l]%2;
                a[l+1]=a[l+1]+1;
            }
        }
        while ((l<9)&&(a[l+1]>1));
    }

}


main()
{
    int x;
    for(x=0;x<9;x++)
        b[x]=x+1;   //1--9
    for(x=0;x<8;x++)
        a[x]=0;     //符号标志位

    work();
}

7 楼

好久不用c了,数组的用法差点还改不过来,下标啊下标,感觉pascal的数组和串还是好用些

8 楼

上面的程序有些小问题,下面是改过的,没有错误,bc3.0下通过
#include <stdio.h>

int a[8],b[9];


void work()
{
    int l,i,temp,j,k;
    for(i=0;i<256;i++)  //0---255对应00000000---11111111
    {
        temp=b[0];
        for(j=0;j<8;j++)
        {
            if (a[j]==0)
               temp=temp-b[j+1];
            else
            if (a[j]==1)
               temp=temp+b[j+1];
        }
        if (temp==15)  //结果正确输出算式
        {
            for (k=0;k<8;k++)
            {
                printf("%d",b[k]);
                if (a[k]==0)
                   printf("-");
                else
                    if (a[k]==1)
                        printf("+");
            }
            printf("%d=15\n",b[8]);
        }

        l=0;   //从这里到do-while是实现符号位的转变
        a[l]=a[l]+1;
        do
        {
            if (a[l]>1)
            {
                a[l]=a[l]%2;
                a[l+1]=a[l+1]+1;
                l++;
            }
        }
        while ((l<9)&&(a[l]>1));
    }

}


main()
{
    int x;
    for(x=0;x<9;x++)
        b[x]=x+1;   //1--9
    for(x=0;x<8;x++)
        a[x]=0;     //符号标志位

    work();
}

9 楼

小女子先谢过楼上的了,我去用C调一下。。。

10 楼

以下程序在borland pascal下编译通过,我想turbo pascal也行。

program c0;
function Cal(choice:byte):boolean;assembler;{选择}
asm
        mov     bl,[bp+4]
        xor     ch,ch
        mov     cl,2
        mov     dl,01h
@@1:
        rol     bl,1
        mov     al,bl
        and     al,00000001b
        cmp     al,00h
        ja      @@2
        add     dl,cl
        jmp     @@3
@@2:    sub     dl,cl
@@3:
        inc     cl
        cmp     cl,9
        jle     @@1

        cmp     dl,15
        je      @@4
        mov     al,0
        jmp     @@5
@@4:    mov     al,1
@@5:
end;
procedure Print(choice:byte);assembler;{打印结果}
asm
        mov     dl,'1'
        mov     ah,02h
        int     21h
        mov     bl,[bp+4]
        xor     ch,ch
        mov     cl,2

@@1:    rol     bl,1
        mov     al,bl
        and     al,00000001b
        cmp     al,00h
        ja      @@2
        mov     dl,'+'
        mov     ah,02h
        int     21h
        jmp     @@3
@@2:
        mov     dl,'-'
        mov     ah,02h
        int     21h
@@3:
        mov     dl,cl
        or      dl,030h
        int     21h
        inc     cl
        cmp     cl,9
        jle     @@1

        mov     dl,'='
        mov     ah,02h
        int     21h
        mov     dl,'1'
        mov     ah,02h
        int     21h
        mov     dl,'5'
        mov     ah,02h
        int     21h
        mov     dl,0ah
        mov     ah,02h
        int     21h
        mov     dl,0dh
        mov     ah,02h
        int     21h
end;
var
   i:byte;
begin
     for i:=0 to 255 do    {从0到255}
         if cal(i) then print(i);
end.

我来回复

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