-1

给定序列 s: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, . ..对于自然数k,0< k <=1000,确定s序列中k位置上元素的值。示例:对于 k=2,值为 1,对于 k=8,值为 2

这是代码:

#include<fstream.h>
#include<math.h>
ofstream f("sir.out");

float Equation (int a, int b, int c)
{ int d;
  float x1,x2;
  d=b*b-4*a*c;
  if(d<0) return -32000;
  else if(d==0) { x1=-b/(2*a);
              if(x1>0) return x1;
              else return -32000;
            }
   else { x1=(-b-sqrt(d))/(2*a);
          x2=(-b+sqrt(d))/(2*a);
          if(x1>x2) if(x1>0) return x1;
                    else return -32000;
          else if(x2>0) return x2;
               else return -32000;
        }
}

void main()
{ int k,n;
  float x;
  cin>>k;
  x=Equation(1,1,-2*k);
  n=x*(x+1)/2;
  if(n==x) f<<n;
  else f<<k-n*(n+1)/2;
  f.close();
}

能否请您解释一下这是如何工作的?我了解该功能,但我不确定如何获得该值...

4

2 回答 2

0

考虑按顺序生成序列中的所有项,将它们存储在具有索引的数据结构中(例如向量),然后简单地查找适当的 k(请记住,您的向量将从零开始索引,而您的分配显然没有)。

于 2013-06-13T18:19:38.847 回答
0

它在说:

让我们 使用二次公式x(x+1)/2 = k
Equation求解。 那么除非发生了奇怪的事情,否则 应该这样做。 Then if is your answer 否则输出x
n=x*(x+1)/2n==k
n==x n
k - n*(n+1)/2


我会做的是:

找出你已经通过了多少完整的序列。然后只计算差异。
为此,您将解决x然后x(x+1)/2 = k 四舍五入x
然后你做k - |x|(|x| + 1)/2(这里|是四舍五入)


那么你能发现你的解决方案与我的不同吗?


x == |x|
实际上,当您的代码几乎正确时,我的忽略了这种情况,只需将其更改为:

void main()
{ 
  int k;
  cin>>k;
  int n = Equation(1,1,-2*k);
  int x = n*(n+1)/2;
  if (x == k) f<<n;
  else f<<k - x;
  f.close();
}
于 2013-06-13T18:23:15.540 回答