【问题标题】:Expressing a number as the sum of two triangular numbers将一个数表示为两个三角数之和
【发布时间】:2020-01-04 18:33:22
【问题描述】:

三角形数或三角形数计算排列成等边三角形的对象。 他们的公式是n(n+1)/2。

我想写一个数字作为两个三角形数字的和。 (24=21+3;48=45+3)

我已经用 C++ 编写了一些代码,这些代码对于较小的数字做得很好。但是随着 N 变大,它变得越来越慢,这让我觉得我的代码效率低下或完全错误。所以我在征求建议。

我愿意接受并感谢您提出的任何批评或想法。这就是我想出的。

它生成数字“i”并为“j”提供 x-i 的值。它测试这两个数字是否都是三角形的(iok,jok),如果是,则将它们打印出来并结束。如果它没有找到这样的数字,它会打印“NO”。

#include <iostream>

using namespace std;

int main(){
    long long x;
    cin>>x;
    long long j,i;
    int iok,jok;
    long sum;
    long long n;

    for(i=1;i<=x;i++){
        iok=0;
        sum=0;
        for (n=1; sum<=i; n++)
        {
            sum = sum + n;
            if (sum==i)
                iok=1;
        }
        j=x-i;
        jok=0;
        sum=0;
        for (n=1; sum<=j; n++)
        {
            sum = sum + n;
            if (sum==j)
                jok=1;
        }
        if(jok && iok){
            cout<<i<<" "<<j;
            return 0;
        }
    }
    cout<<"NO";
    return 0;
}

【问题讨论】:

  • 顶一下,你不需要枚举所有i然后测试i是否是三角形的。你可以循环n 并设置i = n*(n+1)/2,所以你只看三角数字开始。它们非常稀疏,因此外部循环的迭代次数会少得多。另外,您可以尽快停止i &gt; x/2
  • 为什么要检查j是否是三角循环直到sum&lt;=i?不应该是sum&lt;=j吗?
  • 您的算法的时间复杂度为 O(n^2),但您可以通过一个复杂度为 O(n) 的循环来解决问题。遍历n,创建n-th 三角数,从输入中减去它并检查结果是否为三角数。
  • 我只是好奇。有人教你一开始就声明所有变量吗?这是我经常看到初学者的一个坏习惯。阅读:ES.21: Don’t introduce a variable (or constant) before you need to use it
  • @IgorTandetnik 应该是sum&lt;=j,你是对的,谢谢!

标签: c++ triangular


【解决方案1】:

您的算法的时间复杂度为 O(n^2),但您可以通过一个复杂度为 O(n) 的循环来解决问题。迭代 n,创建第 n 个三角数,从输入中减去它并检查结果是否为三角数。 ——托马斯·萨布里克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多