我目前正在试图找到目标数可以表示为两个或多个连续奇数整数之和的次数。我的代码可以在这里找到最长的连续赔率序列:
public class consecutiveOdd {
static int target = 1000000;
public static void main(String[] args){
int longestVariation = -1;
int totalVariations = 0;
for (int k = 1;; k++) {
int i = target / k - k + 1;
if (i <= 0) {
break;
}
// Check if calculated i, can be the start of 'odd' sequence.
if (target % k == 0 && i % 2 == 1) {
longestVariation = k;
totalVariations += 1;
}
}
System.out.println(longestVariation);
System.out.println(totalVariations);
}
}虽然我不确定它是否确定了变化的正确值。有什么东西我忽略了吗?
最好的,奥特曼
发布于 2015-10-14 22:19:21
这并不是一个真正的答案,但它让我想起了皮亚杰的保护测试:
23^2 - 22^2
☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯哪幅画有更多的弹珠?
7^2 - (6^2 + 6^2-5^2 + 5^2-4^2 + 4^2-3^2 + 3^2) - 2^2
☯☯☯☯☯☯☯
☯☯☯☯☯☯☯
☯☯☯☯☯☯☯
☯☯☯☯☯☯☯
☯☯☯☯☯☯☯
☯☯☯☯☯
☯☯☯☯☯
9^2 - (8^2 + 8^2-7^2 + 7^2) - 6^2
☯☯☯☯☯☯☯☯☯
☯☯☯☯☯☯☯☯☯
☯☯☯☯☯☯☯☯☯
☯☯☯
☯☯☯
☯☯☯
☯☯☯
☯☯☯
☯☯☯顺便说一句,任何完美方格中最长的连续奇数划分总是以1开始,在我们的绘图方法中,它可以被认为是(x² - 0²)。
4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
...etc.发布于 2015-10-14 16:00:36
为了确保您的代码很好,您可以实现不同的解决方案,您知道它会得到正确的答案,并将其与高效的方法进行比较。你可以这样做:
public class ConsecutiveOdd {
static String fast(int target) {
int longestVariation = -1;
int totalVariations = 0;
for (int k = 1;; k++) {
int i = target / k - k + 1;
if (i <= 0) {
break;
}
if (target % k == 0 && i % 2 == 1) {
longestVariation = k;
totalVariations += 1;
}
}
return Integer.toString(longestVariation) + " " + Integer.toString(totalVariations);
}
static String slow(int target) {
int longest_length = -1;
int total = 0;
for (int start = 1; start <= target; start += 2) {
int sum = 0;
int t = start;
int seq_length = 0;
while (sum < target) {
sum += t;
seq_length++;
t += 2;
}
if (sum == target) {
// System.out.println(start);
// System.out.println(seq_length);
if (seq_length > longest_length)
longest_length = seq_length;
total++;
}
}
return Integer.toString(longest_length) + " " + Integer.toString(total);
}
static void test(int n) {
int correct = 0;
for (int i = 1; i <= n; ++i) {
if (!slow(i).equals(fast(i))) {
System.out.printf("Testcase %d: FAIL\n", i);
} else {
System.out.printf("Testcase %d: OK\n", i);
correct++;
}
}
System.out.printf("%d/%d\n", correct, n);
}
public static void main(String[] args)
{
test(100);
}
}发布于 2015-10-15 15:30:10
简单地说,是的,你的公式会产生正确的变化量。奇数自然数的所有连续序列s都是形式j * k + 2 * p,其中p是一个金字塔数,1 + 2 + 3...+ (k - 1),表示我们需要在j中添加多少2,以生成序列中的下一个数字。
因为在你的公式中,k必须将target除以没有剩余,我们得到了k i's,其中每个i等于target / k - (k - 1)。您的公式还规定i是奇怪的。我们需要在k i中添加多少2,才能得到target >。
i = target / k - (k - 1)
multiply both sides by k
k * i = k * target / k - (k - 1) * k
k * i + (k - 1) * k = target我们需要将(k - 1) * k / 2 2的公式添加到k i's to get target中。回顾一下连续奇数序列的公式,我们发现这一点已经实现了:
target = k * i + (k - 1) * k
= k * i + 2 * (k - 1) * k / 2
= k * i + 2 * p where p is the pyramid number (k - 1) * k / 2由于您的循环尝试所有可能的i's,我们保证传递所有可能的连续奇数序列,这些序列之和为target。
https://stackoverflow.com/questions/33129392
复制相似问题