给定序列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 <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();
}
请你解释一下这有用吗?我理解这个功能,但我不确定如何获得该值......
答案 0 :(得分:0)
考虑按顺序生成序列中的所有项,将它们存储在带索引的数据结构中(例如向量),然后简单地查找适当的k(记住你的向量将从零开始索引,而你的任务显然没有。)
答案 1 :(得分:0)
它说:
让x(x+1)/2 = k
Equation
使用二次公式求解x
然后n=x*(x+1)/2
应该n==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();
}