C中具有3个变量的线性方程

时间:2018-11-15 13:04:50

标签: c algorithm math equation-solving linear-equation

我得到了我的C类作业,

  

超环轨道由一定长度的各个管段组成。轨道以隔板为起点和终点,每两个管段之间都有一个隔板。段由两个不同的制造商(s1和s2)生产。给出了段(s1,s2),舱壁(b)和所需轨道(1)的长度。任务是开发一个函数,该函数将基于这四个参数来确定是否存在有效的航段和舱壁组合,以产生所需轨道的确切长度,如果有,则输出这些组合的数量

     

注意:两个不同的段的长度可以相等,舱壁的长度也可以等于零。

我的观点是我应该用3个变量求解线性方程:

  

(m)* s1 +(n)* s2 +(m + n + 1)* b = l

但是我不知道应该使用哪种方法编写有效的代码。

2 个答案:

答案 0 :(得分:0)

方程式提供了寻找组合的标准。 为此编写c代码时,只需要迭代m和n并检查是否满足l长度即可。 下面是可以提供组合的伪代码

for m = 0 to l/s1
for n = 0 to l/s2
bnum = m + n - 1
if (m*s1 + n*s2 + bnum*b) == l)
print m, n, bnum

答案 1 :(得分:0)

首先,以不同的方式看待您的建设项目:

  • 必须从隔板开始。
  • 此后,每个管道后面必须有一个隔板。

因此,您需要使用长度为l-bm+b的管道来构建长度为n+b的轨道。

重新分配因子,您会发现在两个变量(而不是3)中有一个方程式。

(m+b)*s1 + (n+b)*s2 = l-b

不失一般性,假设s2> s1。您的轨道将至少需要(下限)这么多的管段,较长的管段中的足够长的管段至少可以达到所需的轨道长度。

ceil( (l-b) / (n+b) )

且(上限)不超过

floor( (l-b) / (m+b) )

您可以蛮力迭代解决方案:

  • 求解s2的方程
  • 在上述范围内迭代s1
  • 对于s1的每个值,请查看s2是否为整数。如果是这样,请记录解决方案。

这很简单,但是很优雅。实际上,您将需要对Diophantine线性方程进行适当的工作,以使用s1, s2 >= 0对所有解进行参数化。