首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连续奇数变化计数

连续奇数变化计数
EN

Stack Overflow用户
提问于 2015-10-14 15:23:44
回答 3查看 224关注 0票数 2

我目前正在试图找到目标数可以表示为两个或多个连续奇数整数之和的次数。我的代码可以在这里找到最长的连续赔率序列:

代码语言:javascript
运行
复制
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);

}

}

虽然我不确定它是否确定了变化的正确。有什么东西我忽略了吗?

最好的,奥特曼

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-14 22:19:21

这并不是一个真正的答案,但它让我想起了皮亚杰的保护测试:

代码语言:javascript
运行
复制
23^2 - 22^2
☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯
☯

哪幅画有更多的弹珠?

代码语言:javascript
运行
复制
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²)

代码语言:javascript
运行
复制
 4 = 1 + 3
 9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
...etc.
票数 0
EN

Stack Overflow用户

发布于 2015-10-14 16:00:36

为了确保您的代码很好,您可以实现不同的解决方案,您知道它会得到正确的答案,并将其与高效的方法进行比较。你可以这样做:

代码语言:javascript
运行
复制
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);
    }
}
票数 0
EN

Stack Overflow用户

发布于 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 >。

代码语言:javascript
运行
复制
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中。回顾一下连续奇数序列的公式,我们发现这一点已经实现了:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33129392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档