【发布时间】: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 > x/2 -
为什么要检查
j是否是三角循环直到sum<=i?不应该是sum<=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<=j,你是对的,谢谢!
标签: c++ triangular