通过连续自然数的加法或减法获得一个数
Posted
技术标签:
【中文标题】通过连续自然数的加法或减法获得一个数【英文标题】:obtain a number by addition or subtraction of consecutive natural numbers 【发布时间】:2013-08-19 07:04:27 【问题描述】:我正在尝试编写一个函数,我可以使用它以最少的步骤获得任何自然数。我可以从 1 开始添加或减去自然数。 条件是:
一个数字只能使用一次
您只能执行加法和减法。
不允许转义任何数字
找到具有最大值的整数的值以获得该数。
例如:如果我想要的数字是 4,那么它在此处获得为 -1+2+3 答案是 3。以类似的方式,如果我想要 6 则 1+2+3 这里 答案是 3。对于 10= 1+2+3+4 是 4。 到目前为止我所拥有的:
到目前为止我所拥有的:
public void step()
int n = (int)Math.sqrt(position * 2);
k = (position - (((n + 1) * n) / 2));
l = ((((n + 1) * (n + 2)) / 2) - position);
System.out.println(k + " " + l);
System.out.println(n);
p = (l > k ? k : l);
r = (l > k ? n : n + 1);
System.out.println(p + " " + r);
if (k == 0)
result = n;
else
result = r + (2 * p);
System.out.println("__________" + result + "__________");
【问题讨论】:
你有没有尝试过? hmmm这是什么作业! 我们会帮助你解决具体的编程问题,但你需要自己编写一个程序来解决逻辑问题。 是的,我的代码是public void step() int n = (int)Math.sqrt(position * 2); k = (position - (((n + 1) * n) / 2)); l = ((((n + 1) * (n + 2)) / 2) - position); System.out.println(k + " " + l); System.out.println(n); p = (l > k ? k : l); r = (l > k ? n : n + 1); System.out.println(p + " " + r); if (k == 0) result = n; else result = r + (2 * p); System.out.println("__________" + result + "__________");
,但这不合适,我猜它需要一些递归函数。
如果你只能使用从 1 开始的数字,怎么在第一个例子中使用 -1?
【参考方案1】:
好的,让我们以这种方式进行。考虑关注binary tree
。现在您可以从每条路径中找到总和,并使用sum=your number(let's say 4)
获取每条路径。现在您可以从中获得最大值。尝试提出实现这一点。如果你尝试一些事情,我可以进一步帮助你。
0
/ \
-1 1
/ \ / \
-2 2 -2 2
【讨论】:
【参考方案2】:解决办法是:
for n=1: = 1
for n=2: = 1+2 => 1+2+3 => 1-2+3
for n=3: = 1+2
for n=4: = 1+2+3 => -1+2+3
for n=5: = 1+2+3 => 1+2+3+4-5
for n=6: = 1+2+3
for n=7: = 1+2+3+4=>1+2+3+4+5=>1+2+3-4+5
for any n, first calculate the S(k)=1+2+3+...+k
其中 S(k)>n 且 x=S(k)-n 是偶数。然后将 x/2 的 + 翻转为 -。
S(k) = (1+k)*k/2 > n
=> k*k + k -2n > 0
=> k > (-1 + sqrt(1+8n))/2
例如,n=7, k > 3.2, 那么 k=4, S(4) = 10, 10-7=3, 这是奇数,所以 k=5, S(5)=15, x=15- 7=8, 8/2=4,翻转4的符号,得到1+2+3-4+5 = 7
在某些情况下,Sk-n 是奇数,但 S(k+1)-n 也是奇数,在这种情况下,我们需要使用 S(k+2)。 代码如下:
public void step()
k = (int)Math.ceil(((-1 + Math.sqrt(1 + 8 * n)) / 2));
int Sk = (1 + k) * k / 2;
if ((Sk - n) % 2 != 0)
k++;
Sk = (1 + k) * k / 2;
if ((Sk - n) % 2 != 0)
k++;
Sk = (1 + k) * k / 2;
int i = (Sk - n) / 2;
System.out.println("maximum number is : " + k + "the number with -ve sign is : " + i);
【讨论】:
以上是关于通过连续自然数的加法或减法获得一个数的主要内容,如果未能解决你的问题,请参考以下文章