回 帖 发 新 帖 刷新版面

主题:第70次编程比赛结果(已定)

有问题就这里问吧,比赛题目帖子链接:
[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.麻烦下次参加比赛的不要开小号)

回复列表 (共34个回复)

11 楼


哦,我知道不算了,谢谢了

12 楼

版主好好好好敬业,这么快测完,赞。
我的程序应该是递归把全部组合都判断过了的。莫非又像69次那样,算法没错,但因double有精度误差而出错?

对于数据:
10
1 2 3 4 5 6 7 8 9 10
10
输出结果错误
正确的结果是什么,版主大人能把全部正确的表达式
如123*4+5-6*78-9-10 = 10
。。。。。
全部打个包上传上来看看,谢谢。

13 楼

楼上最大的失败点就是直接用 == 判断两double是否相等
原本406个解,你的丢了两解

14 楼


不好意思,刚刚仔细检查,发现了一个很低级的错误。
麻烦楼主再看一下下面的代码:

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 楼

楼上的代码不完整,编译失败,不给予通过

16 楼

这道题真的有点难  不知道LZ到最后能给个正确的看看么??

17 楼

[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 楼


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 楼

[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 楼


[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]

我来回复

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