我得到了我的C类作业,
超环轨道由一定长度的各个管段组成。轨道以隔板为起点和终点,每两个管段之间都有一个隔板。段由两个不同的制造商(s1和s2)生产。给出了段(s1,s2),舱壁(b)和所需轨道(1)的长度。任务是开发一个函数,该函数将基于这四个参数来确定是否存在有效的航段和舱壁组合,以产生所需轨道的确切长度,如果有,则输出这些组合的数量
注意:两个不同的段的长度可以相等,舱壁的长度也可以等于零。
我的观点是我应该用3个变量求解线性方程:
(m)* s1 +(n)* s2 +(m + n + 1)* b = l
但是我不知道应该使用哪种方法编写有效的代码。
答案 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-b
和m+b
的管道来构建长度为n+b
的轨道。
重新分配因子,您会发现在两个变量(而不是3)中有一个方程式。
(m+b)*s1 + (n+b)*s2 = l-b
不失一般性,假设s2> s1。您的轨道将至少需要(下限)这么多的管段,较长的管段中的足够长的管段至少可以达到所需的轨道长度。
ceil( (l-b) / (n+b) )
且(上限)不超过
floor( (l-b) / (m+b) )
您可以蛮力迭代解决方案:
s1
这很简单,但是很优雅。实际上,您将需要对Diophantine线性方程进行适当的工作,以使用s1, s2 >= 0
对所有解进行参数化。