主题:小女子有个问题请问各位高手???
xxjs
[专家分:0] 发布于 2005-11-24 09:41:00
小女子初学程序设计,目前只是学完了C的三大结构和基本的数组、函数知识。现有一题不知其解,望各位高手不吝指教!
题:在1 2 3 4 5 6 7 8 9=15 在1-9中加上加号或减号使之等式成立。
请给出C的详解(虽然我知道是用枚举,但不知其详细解法)。[em10]
回复列表 (共11个回复)
沙发
toto061 [专家分:50] 发布于 2005-11-25 10:23:00
设定一个数组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?
板凳
xxjs [专家分:0] 发布于 2005-11-25 12:30:00
有点眉目了,但我试了几次还是在细节上无法实现。请给出全代码,OK???
3 楼
toto061 [专家分:50] 发布于 2005-11-25 14:02:00
你是学c的?
4 楼
toto061 [专家分:50] 发布于 2005-11-25 14:04:00
是要给出所有解?
5 楼
xxjs [专家分:0] 发布于 2005-11-25 15:02:00
我是选用C的,据说转其它语言如Java比较容易一点。请知道这道题解的发帖相助???[em18]
6 楼
toto061 [专家分:50] 发布于 2005-11-25 16:57:00
我写了一个,没有调试,我是用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 楼
toto061 [专家分:50] 发布于 2005-11-25 16:59:00
好久不用c了,数组的用法差点还改不过来,下标啊下标,感觉pascal的数组和串还是好用些
8 楼
toto061 [专家分:50] 发布于 2005-11-27 21:01:00
上面的程序有些小问题,下面是改过的,没有错误,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 楼
xxjs [专家分:0] 发布于 2005-11-28 09:29:00
小女子先谢过楼上的了,我去用C调一下。。。
10 楼
xjwxwy [专家分:0] 发布于 2008-10-04 14:20:00
以下程序在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.
我来回复