你的数学老师是越加公式的忠实拥趸,他认为你应该用它们来解二次方程。给出方程
ax^2 + bx + c = 0其根的乘积为c/a,其和为-b/a。当所有a、b和c都是非零整数时,假设根是有理数,就足以尝试该形式中的所有可能的数字
r1 = ±s/t其中s是abs(c)的除数,t是abs(a)的除数。对于每个这样的r1,将其插入ax^2 + bx + c,并查看结果是否为0。如果是,那么r1就是根。第二个根是-b/a-r1或(c/a)/r1 --您可以选择任何您喜欢的公式。
你的老师决定给你做很多练习,他希望你描述一下你是如何用越共的公式来解决每个问题的。每个练习看起来如下(示例):
9x^2+12x+4=0写一个子例程或程序,得到一个练习作为输入,并输出你所谓的“解决过程”,以安抚你的老师。
由于您将手动将该练习提供给您的程序,请以任何方便的形式对其进行格式化。例如,在stdin上使用空格分隔的值:
9 12 4或调用具有3个参数的函数:
SolveExercise(9, 12, 4);或者从字面上解析这个练习:
9x^2+12x+4=0您的输出应该按照下面描述的格式进行格式化。使用标准输出设备,或将其作为字符串从子程序中返回。
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或者,最后一行可以是:
r2 = 4/9/(-2/3) = -2/3一些补充说明:
0.66666667不等于2/3,因此是不正确的r1和r2的最后表达式中,整数应该是这样输出的,例如-99/1是不可接受的,应该输出为-99;在输出的其他地方,分母等于±1是可以接受的。2/4是1/2的好替代品,尽管它很难看,即使是根r1和r212/9/(2/3)中。如果数学优先规则允许省略括号,则不需要括号,例如-12/9--2/3。允许使用多余的括号:4-(2)是可以的,尽管它很难看r1尝试3个或更多的非整数值;然而,它允许“猜测正确的答案”,几乎总是在第一次尝试。r1的所有试用值都必须是有理数±s/t,其中s和t受到如上所述的约束。发布于 2016-04-20 11:32:21
我相信有一个方法可以进一步缩短这一点,但这是我第一次尝试学习这门语言。
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](*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}输入。
https://codegolf.stackexchange.com/questions/77703
复制相似问题