【问题标题】:Expressing Natural Number by sum of Triangular numbers用三角数之和表示自然数
【发布时间】:2018-10-07 09:48:59
【问题描述】:

三角形数是指事物可以排列成三角形的数字。

例如,1、3、6、10、15...是三角数。

o

o o

o o o

o o o o

是 n=4 三角形数的形状

我要做的是给定一个自然数 N,我必须打印 N用三角数之和表示。

如果 N = 4

输出应该是

1 1 1 1

1 3

3 1

否则,如果 N = 6

输出应该是

1 1 1 1 1 1

1 1 1 3

1 1 3 1

1 3 1 1

3 1 1 1

3 3

6

我已经搜索了几个小时,但找不到答案...

请帮忙。

(我不确定这是否有帮助,但我发现

如果我说当 n 为 k 时 T(k) 是三角数,那么

T(k) = T(k-1) + T(k-3) + T(k-6) + .... + T(k-p) 而 (k-p) > 0

而p是三角数)

这是 k=-1 的代码(阅读下面的 cmets)

#include <iostream>
#include <vector>

using namespace std;

long TriangleNumber(int index);
void PrintTriangles(int index);

vector<long> triangleNumList(450); //(450 power raised by 2 is about 200,000)
vector<long> storage(100001);

int main() {
    int n, p;

    for (int i = 0; i < 450; i++) {
        triangleNumList[i] = i * (i + 1) / 2;
    }
    cin >> n >> p;
    cout << TriangleNumber(n);
    if (p == 1) {
        //PrintTriangles();
    }

    return 0;
}

long TriangleNumber(int index) {
    int iter = 1, out = 0;
    if (index == 1 || index == 0) {
        return 1;
    }
    else {
        if (storage[index] != 0) {
            return storage[index];
        }
        else {
            while (triangleNumList[iter] <= index) {
                storage[index] = ( storage[index] + TriangleNumber(index - triangleNumList[iter]) ) % 1000000;
                iter++;
            }
        }
    }
    return storage[index];
}
void PrintTriangles(int index) {
    // What Algorithm?
}

【问题讨论】:

  • 由于我的英语不太好,非常感谢用简单的英语写的答案..
  • 也许您与我们分享您的一些想法并告诉我们您遇到的问题。
  • 您的问题并不完全清楚。您是否想要将N 写为三角数之和的所有 方式的打印输出?此外,你没有表现出你自己的真正努力。不要寻找答案;编写一些您自己的代码并向我们展示您的尝试。这让我们知道您的编程水平。例如,你了解递归吗? (这是一个提示,但我们确实需要知道这一点。)最后,您想要哪种计算机语言?
  • @RoryDaulton 实际上整个问题是输入的 N 和 k,如果 k = -1 只打印可以表达多少种方式。如果 N=4 并且 k = -1 答案是 3。我在 k= -1 时解决了,但我不知道在 k = 1 时使用什么算法。我会尽快添加我的代码。
  • k 只是我应该打印所有组合还是只打印多少组合的标志。我正在尝试在我的问题中添加我的代码,但它一直说格式错误....

标签: math triangular


【解决方案1】:

这里是一些递归 Python 3.6 代码,用于打印对输入目标求和的三角数的总和。在这个版本中,我优先考虑代码的简单性。您可能希望对输入值添加错误检查、计算总和、存储列表而不是仅仅打印它们,并将整个例程包装到一个函数中。设置三角数列表也可以用更少的代码行来完成。

您的代码通过“记忆”三角数(存储和重用它们而不是总是在需要时计算它们)节省了时间,但恶化了内存使用。如果你愿意,你可以对总和列表做同样的事情。也可以在动态编程风格中更进一步:找到 n=1 的总和列表,然后是 n=2 等。我将把所有这些留给你。

""" Given a positive integer n, print all the ways n can be expressed as
the sum of triangular numbers.
"""
def print_sums_of_triangular_numbers(prefix, target):
    """Print sums totalling to target, each after printing the prefix."""
    if target == 0:
        print(*prefix)
        return
    for tri in triangle_num_list:
        if tri > target:
            return
        print_sums_of_triangular_numbers(prefix + [tri], target - tri)

n = int(input('Value of n ? '))

# Set up list of triangular numbers not greater than n
triangle_num_list = []
index = 1
tri_sum = 1
while tri_sum <= n:
    triangle_num_list.append(tri_sum)
    index += 1
    tri_sum += index

# Print the sums totalling to n
print_sums_of_triangular_numbers([], n)

以下是这段代码两次运行的打印输出:

Value of n ? 4
1 1 1 1
1 3
3 1

Value of n ? 6
1 1 1 1 1 1
1 1 1 3
1 1 3 1
1 3 1 1
3 1 1 1
3 3
6

【讨论】:

  • 답변이정말도움이많이되었습니다。 python python을배운것이그런건지잘모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나모르겠으나로로로옮겨작성하였을때이상한결과를를도출해냅니다해냅니다해냅니다。 예를 들어, c++로 옮긴 코드에서 실행시켜보면 n = 6일 때 1 1 1 1

    1 1 1 1 3

    1 1 1 1 3 3 1

    이런 식으로 출력이 됩니다。 재귀호출하면서 stack상에 어떠한 문제가 생긴것같은데, 왜 c++에서만 이런 문제가 발생하는지 잵 모륤겠>
  • 答案确实帮了很多忙。我不确定我是否在深入学习 python,但我不知道是否是这种情况,但是当我将它移到 c++ 时,我得到了奇怪的结果。例如,如果你在移动到 c++ 的代码中运行,当 n = 6 时, 1 1 1 1

    1 1 1 1 3

    1 1 1 1 3 3 1

    代码>输出。我有一个递归调用,我怀疑堆栈有问题,但我不知道为什么它只发生在c ++中。 (翻译版。抱歉英语不好。)

  • 非常感谢。我错过的是使用 print_sums_of_triangular_numbers(prefix + [tri], target - tri) 时,我只是推回向量并像这样写 Function(pushedVec, target - tri) .我通过不向后推而是制作另一个仅用于连接和发送到 Function 的向量来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2013-10-22
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-09-26
相关资源
最近更新 更多