主题:第70次编程比赛结果(已定)
雨中飞燕 [专家分:18980] 发布于 2008-08-10 03:44:00
有问题就这里问吧,比赛题目帖子链接:
[url]http://bbs.pfan.cn/post-282270.html[/url]
yj1221 和 hdzhyf 的测试结果:
对于数据:
6
1 2 3 4 6 10
14
输出结果错误
apart789 的测试结果:
程序运行结果在n<8时正确
但n>=8时已经严重超时
ckeryradish 的测试结果:
对于数据:
10
1 2 3 4 5 6 7 8 9 10
10
输出结果错误
jowenshaw 的测试结果:
在n>10时超时严重
冠军为jowenshaw,请jowenshaw出下一次的比赛题
(PS.麻烦下次参加比赛的不要开小号)
最后更新于:2008-08-21 20:45:00
回复列表 (共34个回复)
11 楼
yj1221 [专家分:20] 发布于 2008-08-17 21:17:00
哦,我知道不算了,谢谢了
12 楼
ckeryradish [专家分:140] 发布于 2008-08-19 00:15:00
版主好好好好敬业,这么快测完,赞。
我的程序应该是递归把全部组合都判断过了的。莫非又像69次那样,算法没错,但因double有精度误差而出错?
对于数据:
10
1 2 3 4 5 6 7 8 9 10
10
输出结果错误
正确的结果是什么,版主大人能把全部正确的表达式
如123*4+5-6*78-9-10 = 10
。。。。。
全部打个包上传上来看看,谢谢。
13 楼
雨中飞燕 [专家分:18980] 发布于 2008-08-19 00:28:00
楼上最大的失败点就是直接用 == 判断两double是否相等
原本406个解,你的丢了两解
14 楼
JackieRasy [专家分:3050] 发布于 2008-08-19 13:32:00
不好意思,刚刚仔细检查,发现了一个很低级的错误。
麻烦楼主再看一下下面的代码:
int count(int i,int sum,int last)
{
int current=p[i+1];
if(i==length)
return (sum+last==k);
else{
if(current!=0);
return
count(i+1,sum+last,current)
+count(i+1,sum-last,current)
+count(i+1,sum,last*10+current)
+count(i+1,sum,last*current)
+count(i+1,sum,last/current)
-(last%current!=0);
else
return
count(i+1,sum+last,current)
+count(i+1,sum-last,current)
+count(i+1,sum,last*10+current)
+count(i+1,sum,last*current)
}
}
int result(int n)
{
length=n;
return count(1,0,p[1]);
}
15 楼
雨中飞燕 [专家分:18980] 发布于 2008-08-19 20:08:00
楼上的代码不完整,编译失败,不给予通过
16 楼
hyqhero [专家分:50] 发布于 2008-08-19 23:17:00
这道题真的有点难 不知道LZ到最后能给个正确的看看么??
17 楼
ckeryradish [专家分:140] 发布于 2008-08-20 07:50:00
[quote]楼上最大的失败点就是直接用 == 判断两double是否相等
原本406个解,你的丢了两解[/quote]
double精度的问题一直就无法解决。
如果不使用== 判断,版主有什么好的建议?
我想知道另外的两个结果,这样也对得起上周末看完奥运的两个凌晨[em2]
我在屏幕输出的404个结果是
Numbers: 1 2 3 4 5 6 7 8 9 10
Express Result: 10
123*4+5-6*78-9-10 = 10
123-4-5*6-78+9-10 = 10
123+4-5-6-7-89-10 = 10
123-4-5-6*7-8*9+10 = 10
12+34+56+7-89-10 = 10
12+34-56-7+8+9+10 = 10
12+34-5+67-8-9*10 = 10
12-34/5/6-78/9/10 = 10
12-34-5-6*7+89-10 = 10
12-34+5*6-7+8-9+10 = 10
12+34-5-6*7-8+9+10 = 10
12+34-5+6-7*8+9+10 = 10
12+3-45+67-8-9-10 = 10
12*3+45+6-78-9+10 = 10
12/3*45/6+7-8-9-10 = 10
12/3-45-6+7*8-9+10 = 10
12/3-45+6*7+8-9+10 = 10
12+3-45-6*7-8+9*10 = 10
12+3-45-6*7+8*9+10 = 10
12+3-45+6-7*8+9*10 = 10
12+3-45+6+7+8+9+10 = 10
12-3+4+56-78+9+10 = 10
12*3+4+56-7-89+10 = 10
12/3+4+56/7/8-9+10 = 10
12*3/4/56*7*8/9*10 = 10
12*3/4/56*7*8-9+10 = 10
12*3/4*56/7/8/9*10 = 10
12*3/4*56/7/8-9+10 = 10
12*3/4*56/7-8*9+10 = 10
12*3/4*56-7*8*9+10 = 10
12*3/4-56/7/8*9+10 = 10
12*3/4-56/7+8-9+10 = 10
12*3/4-56+7*8-9+10 = 10
12*3/4+56/7-8-9+10 = 10
12*3/4+56-7*8-9+10 = 10
12*3/4+56+7-8*9+10 = 10
12*3-4/56*7*8*9+10 = 10
12*3-4*56/7/8*9+10 = 10
12*3-4-56-7*8+9*10 = 10
12*3-4-56+7+8+9+10 = 10
12*3+4-56*7/8+9+10 = 10
12-3+4+56/7+8-9-10 = 10
12+3*4*56/7-8-9*10 = 10
12+3-4/56*7*8+9-10 = 10
12+3-4*56/7/8+9-10 = 10
12+3-4*56/7+8+9+10 = 10
12+3-4-56/7+8+9-10 = 10
12+3-4-56-7+8*9-10 = 10
12+3-4-56+7*8+9-10 = 10
12+3-4+56/7/8*9-10 = 10
12+3-4+56/7-8+9-10 = 10
12+3-4+56-7*8+9-10 = 10
12/3/4*5+67-8*9+10 = 10
12/3-4-5-67-8+9*10 = 10
12/3-4-5-67+8*9+10 = 10
12/3-4+5+67-8*9+10 = 10
12*3*4-5-67-8*9+10 = 10
12-3*4*5+67-8+9-10 = 10
12-3*4-5-67-8+9*10 = 10
12-3*4-5-67+8*9+10 = 10
12-3*4+5+67-8*9+10 = 10
12+3-4*5-67-8+9*10 = 10
12+3-4*5-67+8*9+10 = 10
12/3*4*5-6/78*910 = 10
12/3+4/5+6*78/9/10 = 10
12*3/4-5-6-78+9*10 = 10
12*3-4*5+6+78-9*10 = 10
12-3+4/5/6+78/9/10 = 10
12+3*4*5/6+78-9*10 = 10
12+3*4*5-6*78/9-10 = 10
12+3-4+5+6+78-9*10 = 10
12/3/4*5*6+7-8-9-10 = 10
12/3/4-5-6-7+8+9+10 = 10
12/3/4+5+6+7-8+9-10 = 10
12/3-4*5+6-7+8+9+10 = 10
12/3-4-5+6*7-8-9-10 = 10
12/3-4+5*6+7-8-9-10 = 10
12/3+4*5+6+7-8-9-10 = 10
12*3/4/5-6+7+8*9/10 = 10
12*3/4*5-6*7+8+9-10 = 10
12*3/4-5+6-7+8+9-10 = 10
12*3/4-5+6+7-8-9+10 = 10
12*3/4+5-6-7+8-9+10 = 10
12*3-4*5-6-7+8+9-10 = 10
12*3-4*5-6+7-8-9+10 = 10
12*3+4*5*6-7*8-9*10 = 10
12*3+4-5*6-7+8+9-10 = 10
12*3+4-5*6+7-8-9+10 = 10
12*3+4+5-6*7+8+9-10 = 10
12-3/4+5-6*7/8+9-10 = 10
12-3*4-5+6*7-8-9-10 = 10
12-3*4+5*6+7-8-9-10 = 10
12-3-4-5-6+7+8-9+10 = 10
12-3-4-5+6-7-8+9+10 = 10
12-3+4-5+6+7+8-9-10 = 10
12-3+4+5-6+7-8+9-10 = 10
12-3+4+5+6-7-8-9+10 = 10
12+3*4-5*6+7+8-9+10 = 10
12+3-4/5*6+7-8*9/10 = 10
12+3-4*5+6*7-8-9-10 = 10
12+3-4-5+6+7-8+9-10 = 10
12+3-4+5-6-7+8+9-10 = 10
12+3-4+5-6+7-8-9+10 = 10
12+3+4/5-6-7+8*9/10 = 10
12+3+4-5-6-7+8-9+10 = 10
12+3+4+5+6+7-8-9-10 = 10
1*234-56-78-9*10 = 10
1+234/5/6/78*9*10 = 10
1*23-45-67+89+10 = 10
1*23+45-67+8-9+10 = 10
1+23-45-67+8+9*10 = 10
1+23-45-6+7*8-9-10 = 10
1+23-45+6*7+8-9-10 = 10
1-23-4-56-7+89+10 = 10
1*23+4-56/7-8+9-10 = 10
1-23-4+56+7-8-9-10 = 10
1+23*4-56/7*8-9-10 = 10
1+23+4+56/7/8-9-10 = 10
1*23+4-5+67-89+10 = 10
1-23+4*5-67+89-10 = 10
1-23-4+5-67+8+9*10 = 10
1+23*4-5-67+8-9-10 = 10
1+23-4-5-67+8*9-10 = 10
1+23-4+5+67-8*9-10 = 10
1+23-4+5+67+8-9*10 = 10
1-23*4*5+6*78-9+10 = 10
1+23-4*5-6-78+9*10 = 10
1+23+4-5*6-78+9*10 = 10
1-23/4/5*6+7+89/10 = 10
1+23*4-5-6+7-89+10 = 10
1+23-4*5*6+7+89+10 = 10
1*23-4-5-6-7+8-9+10 = 10
1*23-4+5+6+7-8-9-10 = 10
1*23+4*5-6*7+8-9+10 = 10
1*23+4-5+6-7+8-9-10 = 10
1*23+4+5-6-7-8+9-10 = 10
1-23-4+5-6+7*8-9-10 = 10
1-23-4+5+6*7+8-9-10 = 10
1-23+4*5-6+7-8+9+10 = 10
1-23+4-5+6*7-8+9-10 = 10
1-23+4+5*6+7-8+9-10 = 10
1+23-4*5+6-7+8+9-10 = 10
1+23-4*5+6+7-8-9+10 = 10
1+23-4-5*6-7+8+9+10 = 10
1+23-4+5-6*7+8+9+10 = 10
1+2*345/6-7-89-10 = 10
1*2*345/6-7-8-9*10 = 10
1*2+345-6*7*8+9-10 = 10
1-2+34+56-78+9-10 = 10
1+2-34-56+78+9+10 = 10
1*2*34-56+7-8+9-10 = 10
1*2-34+56-7-8-9+10 = 10
1*2+34+56/7*8-9*10 = 10
1-2-34+56/7*8-9-10 = 10
1+2-34-56*7/8+9*10 = 10
1/2*34+5+67-89+10 = 10
1+2+34+5+67-89-10 = 10
1*2+34+5+67-8-9*10 = 10
1-2-34+5+67-8-9-10 = 10
1*2*34-5+6-78+9+10 = 10
1*2-34+5*6-78+9*10 = 10
1*2+34*5+6-78-9*10 = 10
1*2+34-5*6*78/9/10 = 10
1-2+34-5-6+78-9*10 = 10
1*2-34-5*6-7+89-10 = 10
1*2-34+5-6*7+89-10 = 10
1/2*34*5-6-7-8*9+10 = 10
1/2*34-5-6-7-8+9+10 = 10
1/2*34+5*6-7*8+9+10 = 10
1/2*34+5+6-7+8-9-10 = 10
1*2*34-5-6*7+8-9-10 = 10
1*2*34+5-6-7*8+9-10 = 10
1*2*34+5+6-7-8*9+10 = 10
1*2+34-5*6-7-8+9+10 = 10
1*2+34+5-6*7-8+9+10 = 10
1*2+34+5+6-7*8+9+10 = 10
1-2-34-5*6-7-8+9*10 = 10
1-2-34-5*6-7+8*9+10 = 10
1-2-34-5*6+7*8+9+10 = 10
1-2-34+5-6*7-8+9*10 = 10
1-2-34+5-6*7+8*9+10 = 10
1-2-34+5+6-7*8+9*10 = 10
1-2-34+5+6+7+8+9+10 = 10
1-2+34+5+6-7-8-9-10 = 10
1-2+34+5+6+7*8-9*10 = 10
1+2*34+5*6-7-8*9-10 = 10
1+2*34+5*6-7+8-9*10 = 10
1+2+34-5-6-7-8+9-10 = 10
1+2+34+5*6-7*8+9-10 = 10
18 楼
ckeryradish [专家分:140] 发布于 2008-08-20 07:50:00
1-2-3*45+67+89-10 = 10
1*2-3-45+67+8-9-10 = 10
1*2+3+45-67+8+9+10 = 10
1-2*3-45+67-8-9+10 = 10
1-2-3+45+67-8-9*10 = 10
1-2+3*45*6-789-10 = 10
1/2+3+45/6*78/9/10 = 10
1-2+3-45-6+78-9-10 = 10
1+2*3+45-6*78/9+10 = 10
1-2+3+45+6*7-89+10 = 10
1/2*3-45/6+7+8-9+10 = 10
1/2-3-45/6-7+8+9+10 = 10
1/2+3-45/6+7+8+9-10 = 10
1*2/3*45-6-7-8-9+10 = 10
1*2/3*45+6*7-8*9+10 = 10
1*2*3-45-6-7+8*9-10 = 10
1*2*3-45-6+7*8+9-10 = 10
1*2*3-45+6*7+8+9-10 = 10
1*2-3-45-6*7+8+9*10 = 10
1*2+3+45-6-7-8-9-10 = 10
1*2+3+45-6+7*8-9*10 = 10
1*2+3+45+6*7-8*9-10 = 10
1*2+3+45+6*7+8-9*10 = 10
1-2/3*45/6+7+8+9-10 = 10
1-2-3+45-6*7-8+9+10 = 10
1-2-3+45+6-7*8+9+10 = 10
1-2+3*45-6*7-8*9-10 = 10
1-2+3*45-6*7+8-9*10 = 10
1-2+3-45+6*7-8+9+10 = 10
1+2/3*45/6-7-8+9+10 = 10
1+2-3+45-6*7+8+9-10 = 10
1+2+3-45-6-7+8*9-10 = 10
1+2+3-45-6+7*8+9-10 = 10
1+2+3-45+6*7+8+9-10 = 10
1-2-3*4-56+78-9+10 = 10
1/2*3/4*56/7+8+9-10 = 10
1/2*3-4/56*7+8-9+10 = 10
1/2-3*4/56*7-8+9+10 = 10
1/2+3-4/56*7+8+9-10 = 10
1*2*3*4/56*7+8+9-10 = 10
1*2*3+4-56/7/8-9+10 = 10
1*2*3+4+56/7/8+9-10 = 10
1*2-3*4+56/7/8+9+10 = 10
1*2-3-4+56/7+8+9-10 = 10
1*2+3/4*56-7-8-9-10 = 10
1*2+3/4*56+7*8-9*10 = 10
1*2+3+4/56*7*8-9+10 = 10
1*2+3+4*56/7/8-9+10 = 10
1*2+3+4*56/7-8-9-10 = 10
1*2+3+4-56/7/8*9+10 = 10
1*2+3+4-56/7+8-9+10 = 10
1*2+3+4-56+7*8-9+10 = 10
1*2+3+4+56/7-8-9+10 = 10
1*2+3+4+56-7*8-9+10 = 10
1*2+3+4+56+7-8*9+10 = 10
1-2*3*4-56+7-8+9*10 = 10
1-2*3*4-56+7+8*9+10 = 10
1-2*3-4/56*7*8+9+10 = 10
1-2*3-4*56/7/8+9+10 = 10
1-2*3-4-56/7+8+9+10 = 10
1-2*3-4-56-7-8+9*10 = 10
1-2*3-4-56-7+8*9+10 = 10
1-2*3-4-56+7*8+9+10 = 10
1-2*3-4+56/7/8*9+10 = 10
1-2*3-4+56/7-8+9+10 = 10
1-2*3-4+56-7*8+9+10 = 10
1-2-3-4-56/7/8+9+10 = 10
1-2+3*4/56*7*8+9-10 = 10
1-2+3*4*56/7/8+9-10 = 10
1-2+3*4-56/7+8+9-10 = 10
1-2+3*4-56-7+8*9-10 = 10
1-2+3*4-56+7*8+9-10 = 10
1-2+3*4+56/7/8*9-10 = 10
1-2+3*4+56/7-8+9-10 = 10
1-2+3*4+56-7*8+9-10 = 10
1+2*3/4*56-7*8-9-10 = 10
1+2*3/4*56+7-8*9-10 = 10
1+2*3/4*56+7+8-9*10 = 10
1+2*3*4-56/7-8-9+10 = 10
1+2*3+4/56*7*8+9-10 = 10
1+2*3+4*56/7/8+9-10 = 10
1+2*3+4-56/7+8+9-10 = 10
1+2*3+4-56-7+8*9-10 = 10
1+2*3+4-56+7*8+9-10 = 10
1+2*3+4+56/7/8*9-10 = 10
1+2*3+4+56/7-8+9-10 = 10
1+2*3+4+56-7*8+9-10 = 10
1+2-3*4/56*7*8+9+10 = 10
1+2-3*4*56/7/8+9+10 = 10
1+2-3*4-56/7+8+9+10 = 10
1+2-3*4-56-7-8+9*10 = 10
1+2-3*4-56-7+8*9+10 = 10
1+2-3*4-56+7*8+9+10 = 10
1+2-3*4+56/7/8*9+10 = 10
1+2-3*4+56/7-8+9+10 = 10
1+2-3*4+56-7*8+9+10 = 10
1+2+3+4-56/7/8-9+10 = 10
1+2+3+4+56/7/8+9-10 = 10
1+2/3+4/5+678/9/10 = 10
1*2-3+4-5-67+89-10 = 10
1-2+3+4*5+67-89+10 = 10
1+2*3-4-5-67+89-10 = 10
1*2*3+4-5+67-8*9+10 = 10
1*2*3+4+5-67+8*9-10 = 10
1*2-3*4+5-67-8+9*10 = 10
1*2-3*4+5-67+8*9+10 = 10
1*2-3-4*5-67+8+9*10 = 10
1*2+3+4*5+67-8*9-10 = 10
1*2+3+4*5+67+8-9*10 = 10
1-2*3*4*5+67+8*9-10 = 10
1-2*3+4*5-67+8*9-10 = 10
1-2-3+4-5-67-8+9*10 = 10
1-2-3+4-5-67+8*9+10 = 10
1-2-3+4+5+67-8*9+10 = 10
1+2+3+4-5+67-8*9+10 = 10
1+2+3+4+5-67+8*9-10 = 10
1*2*3*4/5+6*78/9/10 = 10
1*2+3+4-5-6-78+9*10 = 10
1-2*3+4+5-6-78+9*10 = 10
1-2-3*4*5-6+78+9-10 = 10
1-2-3*4+5+6-78+9*10 = 10
1-2-3-4+5*6+78-9*10 = 10
1-2-3+4*5+6+78-9*10 = 10
1-2+3*4+5+6+78-9*10 = 10
1+2/3-4+5+6-78/9+10 = 10
1+2*3+4+5+6+78-9*10 = 10
1+2+3*4*5+6-78+9+10 = 10
1/2/3+4/5/6*7+89/10 = 10
1-2-3+4*5*6-7-89-10 = 10
1/2/3+4/5/6*7+8+9/10 = 10
1/2*3/4*5+6-7/8*9+10 = 10
1/2*3*4*5-6-7-8-9+10 = 10
1/2*3*4*5+6*7-8*9+10 = 10
1/2*3*4-5*6-7*8+9*10 = 10
1/2*3*4-5*6+7+8+9+10 = 10
1/2+3/4-5-6*7/8+9+10 = 10
1*2*3*4-5*6+7+8-9+10 = 10
1*2*3-4*5+6+7-8+9+10 = 10
1*2-3/4-5-6*7/8+9+10 = 10
1*2-3*4*5/6+7-8+9+10 = 10
1*2-3*4+5+6*7-8-9-10 = 10
1*2-3-4*5-6+7*8-9-10 = 10
1*2-3-4*5+6*7+8-9-10 = 10
1*2-3-4-5-6*7+8*9-10 = 10
1*2-3-4-5+6+7+8+9-10 = 10
1*2-3-4+5-6+7+8-9+10 = 10
1*2-3-4+5+6-7-8+9+10 = 10
1*2-3+4-5*6+7*8-9-10 = 10
1*2-3+4-5-6+7-8+9+10 = 10
1*2-3+4+5+6+7+8-9-10 = 10
1*2+3/4*5+6*7/8+9-10 = 10
1*2+3/4+5*6*7/8-9-10 = 10
1*2+3*4*5/6*7-8*9+10 = 10
1*2+3*4*5/6+7-8+9-10 = 10
1*2+3*4+5*6-7-8-9-10 = 10
1*2+3*4+5*6+7*8-9*10 = 10
1*2+3-4/5+6+7-8*9/10 = 10
1*2+3-4-5-6-7+8+9+10 = 10
1*2+3-4+5+6+7-8+9-10 = 10
1*2+3+4/5*6-7+8*9/10 = 10
1*2+3+4*5-6*7+8+9+10 = 10
1*2+3+4-5+6-7+8+9-10 = 10
1*2+3+4-5+6+7-8-9+10 = 10
1*2+3+4+5-6-7+8-9+10 = 10
1-2/3/4*5*6+7+8+9-10 = 10
1-2/3*4*5*6+7-8+9*10 = 10
1-2/3*4*5*6+7+8*9+10 = 10
1-2*3*4+5-6-7*8+9*10 = 10
1-2*3*4+5-6+7+8+9+10 = 10
1-2*3-4*5+6*7-8-9+10 = 10
1-2*3-4-5+6+7-8+9+10 = 10
1-2*3-4+5-6-7+8+9+10 = 10
1-2*3+4*5*6*7/8-9*10 = 10
1-2*3+4*5*6-7-8-9*10 = 10
1-2*3+4+5+6-7+8+9-10 = 10
1-2*3+4+5+6+7-8-9+10 = 10
1-2-3*4-5-6-7*8+9*10 = 10
1-2-3*4-5-6+7+8+9+10 = 10
1-2-3+4*5-6-7+8+9-10 = 10
1-2-3+4*5-6+7-8-9+10 = 10
1-2-3+4-5+6*7-8-9-10 = 10
1-2-3+4+5*6+7-8-9-10 = 10
1-2+3*4*5-6*7-8-9+10 = 10
1-2+3*4*5+6-7*8-9+10 = 10
1-2+3*4*5+6+7-8*9+10 = 10
1-2+3*4-5+6+7-8+9-10 = 10
1-2+3*4+5-6-7+8+9-10 = 10
1-2+3*4+5-6+7-8-9+10 = 10
1-2+3-4*5-6-7*8+9*10 = 10
1-2+3-4*5-6+7+8+9+10 = 10
1-2+3-4+5*6-7+8-9-10 = 10
1-2+3+4*5+6-7+8-9-10 = 10
1-2+3+4-5*6-7*8+9*10 = 10
1-2+3+4-5*6+7+8+9+10 = 10
1+2/3/4*5*6-7-8+9+10 = 10
1+2*3*4*5-6-7-8-9*10 = 10
1+2*3*4-5-6+7+8-9-10 = 10
1+2*3*4-5+6-7-8+9-10 = 10
1+2*3*4+5-6-7-8-9+10 = 10
1+2*3*4+5+6*7-8*9+10 = 10
1+2*3-4-5*6+7*8-9-10 = 10
1+2*3-4-5-6+7-8+9+10 = 10
1+2*3-4+5+6+7+8-9-10 = 10
1+2*3+4-5+6+7-8+9-10 = 10
1+2*3+4+5-6-7+8+9-10 = 10
1+2*3+4+5-6+7-8-9+10 = 10
1+2-3*4-5+6+7-8+9+10 = 10
1+2-3*4+5-6-7+8+9+10 = 10
1+2-3-4+5*6-7-8+9-10 = 10
1+2-3+4*5-6+7+8-9-10 = 10
1+2-3+4*5+6-7-8+9-10 = 10
1+2+3*4*5-6*7+8-9-10 = 10
1+2+3*4+5-6+7+8-9-10 = 10
1+2+3*4+5+6-7-8+9-10 = 10
1+2+3-4*5+6+7-8+9+10 = 10
Timing 1.14 Seconds
Express counts Found: 404
如果把程序中的double替换成float则得到了491个结果
因精度问题像下列的表达式也被算是正确了>_<,由此也可以想象double其实也...
1/2/3/456789+10 = 10
1/2/3/45678/9+10 = 10
1/2/3/4567/89+10 = 10
1/2/3/456/789+10 = 10
19 楼
jowenshaw [专家分:0] 发布于 2008-08-20 14:09:00
[code=c]
//优化了下,改了一个bug.个人认为应该没问题了。代码如下:
/*******************************************************************************************
* Written by jowenshaw, 19 Aug 2008. Compiled by DEV-C++ 4.9.9.9.2 && TC++ 3.0 && VC++ 6.0
********************************************************************************************/
#include<stdio.h>
#include<malloc.h>
long cal(long **num,int len,long k,int lev);
long max1=0L,max2=0L;//分子和分母的最大可能取值
int main()
{
int no_min=2;
int no_max=13;
int k_max=9999;
int len_max=14; //(<=18)太长可能产生越界
long num_max=999999999L;
int n;
long *num=0;
long k;
long res=0L;
long *num0=0;
long *num1[2];
long temp;
int i,len,len_k;
int input_right=0;//输入格式是否正确标志
//input from the keyboard
if(!scanf("%d",&n)) goto error; //n
if(n<no_min||n>no_max) goto error;
num=(long*)malloc(n*sizeof(long));
for(i=0;i<n;i++)
{
if(!scanf("%ld",&num[i])) goto error; //num[]
if(num[i]<1||num[i]>num_max) goto error;
}
if(!scanf("%ld",&k)) goto error; //k
if(k<-k_max||k>k_max) goto error;
len_k=0;
temp=k;
while(temp!=0)
{
temp/=10;
len_k++;
}
len=0;
for(i=0;i<n;i++)
{
temp=num[i];
while(temp!=0)
{
temp/=10;
len++;
}
}
if(len_k+len>len_max) goto error;
input_right=1;
if(len>=len_k)
{
//calulate max1,max2
len=len_max/2;
max1=9L;
for(i=1;i<len;i++)
max1=max1*10+9;
len=(len_max+1-2*len_k)/2;
max2=9L;
for(i=1;i<len;i++)
max2=max2*10+9;
num0=(long*)malloc(n*sizeof(long));
for(i=0;i<n;i++)
num0[i]=1L;
num1[0]=num;
num1[1]=num0;
res=cal(num1,n,k,0);
if(num0!=0) free(num0);
}
printf("%ld\n",res);
error:
if(input_right==0)
printf("ERROR: the input format is wrong!\n");
if(num!=0) free(num);
//system("PAUSE");//use this only when compiled by DEV-C++ to see the results.
return 0;
}
[/code
20 楼
jowenshaw [专家分:0] 发布于 2008-08-20 14:20:00
[code=c]
long cal(long **num,int len,long k,int lev)
{
long count=0;
long *num1=0;//分子
long *num2=0;//分母
long *num3[2];
long base;
int i,j;//loop
long t1,t2,t,temp1,temp2,temp;//temp
if(len==2)
{
for(i=0;i<len;i++)
{
if(num[1][i]!=1)
{//reduction
temp1=num[0][i];
temp2=num[1][i];
while(temp2!=0)
{
temp=temp2;
temp2=temp1%temp2;
temp1=temp;
}
num[0][i]/=temp1;
num[1][i]/=temp1;
}
}
switch(lev)
{//don't use break
case 0:
temp=num[0][1];
base=1;
while(temp!=0)
{
temp/=10;
base*=10;
}
if(num[0][0]<=k/base&&num[0][0]*base+num[0][1]==k)
count++;
case 1:
if(num[0][1]%num[1][0]==0&&k%num[0][0]==0
&&num[0][1]/num[1][0]==k/num[0][0])
count++;
if(num[1][0]==1&&num[0][0]%num[0][1]==0
&&num[0][0]/num[0][1]==k)
count++;
case 2:
if(num[1][0]==num[1][1])
{
if((num[0][0]+num[0][1])%num[1][0]==0
&&(num[0][0]+num[0][1])/num[1][0]==k)
count++;
if((num[0][0]-num[0][1])%num[1][0]==0
&&(num[0][0]-num[0][1])/num[1][0]==k)
count++;
}
}
return count;
}
[/code]
我来回复