我正在创建一个 Java 程序,但我正在处理数学问题,但似乎无法解决它。这是我的任务:
I have infinite numbers of numbered papers(1,2,3, ..).
This papers are stacked into stacks using 2 variables a and b.
If a = 5 and b = 3 the stacks look like:
So the first stack has "a" items (5) and each next has "b" more (3) as previous.
现在我必须找出一个等式,它会告诉我我需要删除多少篇论文才能找到具体的。
例如,如果我想查看编号为20的纸张,我需要删除4张纸才能到达。这是我正在寻找的解决方案,当我输入一些特定的论文时,我只需要知道我需要移动多少(在它所在的堆栈中)才能到达它。当我有这个我把所有的文件都放回并搜索下一个。
由于我将使用它制作程序,这将处理长数字(最多16位),最好的解决方案是找到一些"非循环"方程。例如,如果我将设置a = 34354和b = 56774,我想知道要删除多少张纸以获得编号为533663634611112的纸张。
我的输入将是:
- 数字a和b
- 我想要达到的论文数量(c)
- 关于上述变量(c),我将输入许多代表编号纸张的数字
输出:
- 我必须移动的文件数量才能找到我插入的所有文件
所有数字都会很长,所以制作非循环程序是最好的。 感谢您对此问题的所有帮助。
答案 0 :(得分:2)
您不需要任何循环。 n
堆中的论文数量为a + (n-1)b
。因此,第一个n
桩中的论文数量是(算术系列)(b/2)n^2 + (a - b/2)n
。
使用此功能,查找获得纸张所需的桩数。在您的示例中,将此值设置为20(并使用3和5)。所以你有20 = 1.5n^2 + 3.5n
。 Solving this(使用二次公式)得出n = -5
和n = 8/3
。忽略负面因素,因为在这种情况下没有意义。
如果您需要8/3桩来找到您的纸张,它必须在第3堆(圆形到最近的int(天花板功能))。使用上面的公式与n = 3
一起查找前三堆(1.5 * 3^2 + 3.5 * 3 = 13.5 + 10.5 = 24
)中有24篇论文。
24 - 20 = 4 =您需要删除的文件数量。
mockup solution, you need to remove hardcoding and make sure nothing overflows for the large numbers
答案 1 :(得分:0)
你需要某种循环才能做到这一点。我可以帮助数学,但其他人可能需要帮助编程
j=1
TOTAL = ja + (j-1)b
If the TOTAL is less than c, then let j=j+1 and loop
If the TOTAL is greater than c, end the loop (this loop shouldn't take too long)
Then calc TOTAL - c from it to get your answer
该方法应该有效。但假设这样的循环即使长数也不会占用太大的力量。
答案 2 :(得分:0)
Mathy回答,但它可能足以帮助你:
堆栈数是两个不等式的单整数解:
ax + b(x-1)> argument AND a(x-1) + b(x-2) < argument
是否可以在不使用循环的情况下计算,我不能说,我不知道任何可以帮助你的库(虽然我不是数学Java库的专家)。之后,您正在寻找的答案是
a*x + b(x-1) - argument