首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用越共公式求解二次方程

用越共公式求解二次方程
EN

Code Golf用户
提问于 2016-04-12 21:08:01
回答 1查看 981关注 0票数 5

博览会

你的数学老师是越加公式的忠实拥趸,他认为你应该用它们来解二次方程。给出方程

代码语言:javascript
复制
ax^2 + bx + c = 0

其根的乘积为c/a,其和为-b/a。当所有abc都是非零整数时,假设根是有理数,就足以尝试该形式中的所有可能的数字

代码语言:javascript
复制
r1 = ±s/t

其中sabs(c)的除数,tabs(a)的除数。对于每个这样的r1,将其插入ax^2 + bx + c,并查看结果是否为0。如果是,那么r1就是根。第二个根是-b/a-r1(c/a)/r1 --您可以选择任何您喜欢的公式。

你的老师决定给你做很多练习,他希望你描述一下你是如何用越共的公式来解决每个问题的。每个练习看起来如下(示例):

代码语言:javascript
复制
9x^2+12x+4=0

写一个子例程或程序,得到一个练习作为输入,并输出你所谓的“解决过程”,以安抚你的老师。

输入

由于您将手动将该练习提供给您的程序,请以任何方便的形式对其进行格式化。例如,在stdin上使用空格分隔的值:

代码语言:javascript
复制
9 12 4

或调用具有3个参数的函数:

代码语言:javascript
复制
SolveExercise(9, 12, 4);

或者从字面上解析这个练习:

代码语言:javascript
复制
9x^2+12x+4=0

您的输出应该按照下面描述的格式进行格式化。使用标准输出设备,或将其作为字符串从子程序中返回。

输出(示例)

代码语言:javascript
复制
x = 1? 9x^2+12x+4 = 25
x = 2? 9x^2+12x+4 = 64
x = 1/3? 9x^2+12x+4 = 9
x = 2/3? 9x^2+12x+4 = 16
... (as many or as few failed attempts as you like)
x = -2/3? 9x^2+12x+4 = 0
r1 = -2/3
r2 = -12/9-(-2/3) = -2/3

或者,最后一行可以是:

代码语言:javascript
复制
r2 = 4/9/(-2/3) = -2/3

一些补充说明:

  • 输出中的最小换行数如示例中所述(不需要尾行中断)。允许额外的换行。
  • 输入的所有系数都是-9999.9999范围内的整数,任何系数都不能等于0。
  • 所有根都是有理数,应该作为有理数输出例如0.66666667不等于2/3,因此是不正确的
  • r1r2的最后表达式中,整数应该是这样输出的,例如-99/1是不可接受的,应该输出为-99;在输出的其他地方,分母等于±1是可以接受的。
  • 减少有理数的形式是不需要的,例如2/41/2的好替代品,尽管它很难看,即使是根r1r2
  • 输出中的括号有时是数学规则所要求的,例如在表达式12/9/(2/3)中。如果数学优先规则允许省略括号,则不需要括号,例如-12/9--2/3。允许使用多余的括号:4-(2)是可以的,尽管它很难看
  • 至少应该有一种情况(输入),您的程序为r1尝试3个或更多的非整数值;然而,它允许“猜测正确的答案”,几乎总是在第一次尝试。
  • r1的所有试用值都必须是有理数±s/t,其中st受到如上所述的约束。

测试用例

  1. 输入x^2-x-2=0或1-1-2可能的输出x=1?X^2-x-2=-2x=-1?x^2-x-2=0 r1=-1 r2=-2/1/-1=2
  2. 输入-x^2+2x-1=0或-1,2x,-1可能的输出x=1?-x^2+2x-1=0 r1=1 r2=-2/-1-1=1
  3. 输入7x^2-316x+ 924 =0或X(7,-316,924);可能的输出(924的除数为42,通过“运气”求解方程) x=42? 7x^2-316x+924=0 r1=42 r2=316/7-42=22/7
  4. 输入6x^2-35x-6=0或6-35 6可能的输出(即使程序可能“知道”6是根,它决定显示一些失败的试验) x=1/2? 6x^2-35x-6=-88/4 x=1/3? 6x^2-35x-6=-153/9 x=3/2? 6x^2-35x-6=-180/4x=6/1? 6x^2-35x-6=0 r1=6 r2=35/6-6=-1/6 -6=-1/6 r2=-6 r2=-6/6/6/1/6
  5. 不可能的输入(没有合理的解决方案) x^2+5x+1=0
  6. 不可能输入(零系数) x^2-1=0
EN

回答 1

Code Golf用户

发布于 2016-04-20 11:32:21

Mathematica,236 Bytes

我相信有一个方法可以进一步缩短这一点,但这是我第一次尝试学习这门语言。

Golfed

代码语言:javascript
复制
s=Input[];f[x_]:=#3 x^2+#1 x+#2&@@s;t=Drop[Z1,1];r=Catch[Do[Print[StringForm["x=``? ``=``",y,f[x],f[y]]];If[f[y]==0,Throw[y]],{y,(Flatten[Outer[Divide,#1,#2]]&@@(Join[#,-#]&/@Divisors[#]&[t]))}]]StringForm["r1=``\nr2=``",r, #1/#2/r&@@t]

未加注释

代码语言:javascript
复制
(*Get coefficients in list {B,C,A}*)
s=Input[];

(*Create the function*)
f[x_]:=#3 x^2+#1 x+#2&@@s;

(*Take C and A*)
t=Drop[Z1,1];

(*Get a list of all positive and negative divisors for C and A, then use those to get all possible permutations for R=S/T as given in the challenge*)
(*Print out each attempt at finding a root. If one is found, exit the loop and return it*)

r=Catch[Do[Print[StringForm["x=``? ``=``",y,f[x],f[y]]];If[f[y]==0,Throw[y]],{y,(Flatten[Outer[Divide,#1,#2]]&@@(Join[#,-#]&/@Divisors[#]&[t]))}]];

(*Print the roots using (c/a)/r1 *)
StringForm["r1=``\nr2= ``",r, #1/#2/r&@@t]

系数必须以(方便)形式{B,C,A}输入。

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/77703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档