心情愉快,散200分,顺便玩个算法

AFIC 2007-04-13 04:03:01
终于招聘到一个爱好算法的人,哈哈心情愉快阿,
虽然散分这可是技术分,能实现下面这个算法的得绝大部分的分。
算法是
用给定五个数字利用加减乘除各一次(显然也只能1次、可以有括号,不可以利用阶乘等其他运算)算得结果为指定的某数?
没错,就是刚才在水源看到的……

说明
1用powerbuilder实现(版本不限)
2 5个数不会重复
3编写一个函数实现,参数类型定义如下(参数的名字你自己随便吧)
第一个参数我会传一个long的数组
前5个数是给定的五个数字
第六个是指定的结果
我会保证数据正确,所以你不必进行正确性校验
第二个参数我会传递一个dw
用来存放结果
只有一列,string类型,你可以通过
dw.object.#1[xx]
等方法访问,
请存放所有结果。
4函数实现后,导出为srf,把内容拷贝到下边。
5每人可多次参加,只算最后的
6俺来当裁判,比下运行效率,说白了两个cpu想减。这回不会食言了……
7最晚截止到五一假期结束

例子,比如我传的数组是
{2,1,3,4,5,19}
那么调用玩你的函数后
dw应该至少有1行,且内容是
5*4+2-3/1

俺发起的算法贴
http://community.csdn.net/Expert/TopicView2.asp?id=5338869&datebasetype=now
http://community.csdn.net/Expert/TopicView2.asp?id=5370530&datebasetype=now
...全文
530 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
AFIC 2007-04-26
  • 打赏
  • 举报
回复
好吧……
rightyeah 2007-04-26
  • 打赏
  • 举报
回复
没有人有兴趣嘛,还是结贴吧
rightyeah 2007-04-23
  • 打赏
  • 举报
回复
好像生意不大好嘛
huai4le 2007-04-23
  • 打赏
  • 举报
回复
ddd
cqy2000 2007-04-23
  • 打赏
  • 举报
回复
up
hanxianzhong 2007-04-23
  • 打赏
  • 举报
回复
ding
houdongfeng 2007-04-19
  • 打赏
  • 举报
回复
jf
da21 2007-04-19
  • 打赏
  • 举报
回复
jf
ribut9225 2007-04-18
  • 打赏
  • 举报
回复
感觉类似于算24点
kt563 2007-04-17
  • 打赏
  • 举报
回复
up ,这个问题让我想起了著名数学家的一个说法:
任意给五个运算数,一个合数(给的数有合理解) . + - * / 各只能用一次,()随便用.
在1分钟内算出来的是"天才",三分钟内算出来的是"人才",能算出来的就不说了,根本不能算出来的...
先MARK下,呵呵.

hanxianzhong 2007-04-17
  • 打赏
  • 举报
回复
jf
moyanwuhen 2007-04-17
  • 打赏
  • 举报
回复
up,up,up!!!

niu!rightyeah(众妙之门) (
rightyeah 2007-04-17
  • 打赏
  • 举报
回复
嘿嘿,昨天匆匆忙忙的,搞错了,逆波兰式,只有14种优先级组合,因为逆波兰式是从左到右计算的。
算法如下:
$PBExportHeader$f2.srf
global type f2 from function_object
end type

forward prototypes
global function integer f2 (long al_data[], ref datawindow ao)
end prototypes

global function integer f2 (long al_data[], ref datawindow ao);string a[5]
string b[]={'+','-','*','/'}
string aa[120,5],bb[24,4]
long cc[14,4]
long i[5],cnt,j,k,l,m,p,q,ll_lencc
for i[1]=1 to 5
a[i[1]]=string(al_data[i[1]])
//messagebox('',string(al_data[i[1]]))
next
cnt=1
for i[1]=1 to 5
for i[2]=1 to 5
if i[2]=i[1] then continue
for i[3]=1 to 5
if i[3]=i[1] or i[3]=i[2] then continue
for i[4]=1 to 5
if i[4]=i[1] or i[4]=i[2] or i[4]=i[3] then continue
for i[5]=1 to 5
if i[5]=i[1] or i[5]=i[2] or i[5]=i[3] or i[5]=i[4] then continue
aa[cnt,1]=a[i[1]]
aa[cnt,2]=a[i[2]]
aa[cnt,3]=a[i[3]]
aa[cnt,4]=a[i[4]]
aa[cnt,5]=a[i[5]]
cnt++
if cnt >120 then goto loop1
next
next
next
next
next
loop1:
//messagebox('',aa[2,1]+aa[2,2]+aa[2,3]+aa[2,4]+aa[2,5])
cnt=1
for i[1]=1 to 4
for i[2]=1 to 4
if i[2]=i[1] then continue
for i[3]=1 to 4
if i[3]=i[1] or i[3]=i[2] then continue
for i[4]=1 to 4
if i[4]=i[1] or i[4]=i[2] or i[4]=i[3] then continue
bb[cnt,1]=b[i[1]]
bb[cnt,2]=b[i[2]]
bb[cnt,3]=b[i[3]]
bb[cnt,4]=b[i[4]]
cnt ++
if cnt>24 then goto loop2
next
next
next
next
loop2:
cnt=1
for i[1]=2 to 5
for i[2]=max(3,i[1]) to 5
for i[3]=max(4,i[2]) to 5
cc[cnt,1]=i[1]
cc[cnt,2]=i[2]
cc[cnt,3]=i[3]
cc[cnt,4]=5 //最后一个运算符必然在最后一个运算数后面
cnt ++
next
next
next
ll_lencc=cnt -1
//messagebox('',ll_lencc)
//return 0
//messagebox('',bb[1,1]+bb[1,2]+bb[1,3]+bb[1,4])

string sa,sb,ss[0 to 6],s,sall[],ls_last
dec da,db,dd[5],d
//ao.insertrow(0)
for j= 1 to 120 //aa
for k=1 to 24 //bb
for l=1 to ll_lencc //cc
p=1
d=0
for m= 1 to 5
d++
ss[d]=aa[j,m]
dd[d]=long(aa[j,m])
do while m=cc[l,p]
d --
ss[d]+=ss[d+1]+bb[k,p]
choose case bb[k,p]
case '+'
dd[d]+=dd[d+1]
case '-'
dd[d]-=dd[d+1]
case '*'
dd[d]*=dd[d+1]
case '/'
if dd[d+1]=0 then
//失败
d=al_data[6] +1
goto loop3
else
dd[d]/=dd[d+1]
end if
end choose
p ++
if p>4 then exit
loop
next
d=dd[1]
s=ss[1]
loop3:
//messagebox('',ao.describe("evaluate('"+s+"',1)"))
if round(d,2)=al_data[6] and s<> ls_last then
sall[upperbound(sall) +1]=s
//+" "+aa[j,1]+aa[j,2]+aa[j,3]+aa[j,4]+aa[j,5]+bb[k,1]+bb[k,2]+bb[k,3]+bb[k,4]//eval(s)
ls_last=s
end if
next
next
next
ao.object.#1.current=sall
ao.setsort("#1")
ao.sort()
ao.setfilter("getrow()>1 and a<> a [-1]")
ao.filter()

return 0

end function

mzqfk 2007-04-17
  • 打赏
  • 举报
回复
先UP 一个!
da21 2007-04-17
  • 打赏
  • 举报
回复
顶一下
masmoro 2007-04-16
  • 打赏
  • 举报
回复
up
AFIC 2007-04-16
  • 打赏
  • 举报
回复
因为题目说的很清楚,是 玩 啊。
而且不简单阿,不信你试试?
renwanly 2007-04-16
  • 打赏
  • 举报
回复
楼主太没有理想了,为什么一定要限制在5个呢?又为什么要限制在四则运算呢?
最不能理解的是为什么要做这么一个没有什么实际用途的简单算法呢?
......
随便说一下,别当真:D
sdsxlj 2007-04-16
  • 打赏
  • 举报
回复
2
sdsxlj 2007-04-16
  • 打赏
  • 举报
回复
1
加载更多回复(30)

397

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧