1 http://poj.org/problem?id=2000
2 这是一道关于数学上数列的问题,题目给出了骑士为国王服务的天数,要求输出骑士得到的金币
3 要想得到最终的答案,最简单的方法就是找到,骑士第几次给国王服役,因为骑士第一次给国王服役一天,然后每次服役都比上一次服役的时间增加一天,这就相当于数学上的等差数列,公差是1.我们要做的就是求出对应的那个n
4 公式n*(n+1)/2是最终的和
5 但是题目中所给的那个数,并不一定凑巧就是等差数列的和,所以就要做一下排除
6 求出n之后,就用1*1+2*2+3*3......+n*n;然后加上剩余的一部分,就是最终的答案
7 其中用到的一个公式就是高中数学中,数列求和的公式
8 1*1+2*2+3*3+...+n*n = n*(n+1)*(2*n+1)/6
9 下面是代码部分,很简短
10 #include<stdio.h>
11 #include<math.h>
12 #include<iostream>
13 using namespace std;
14 int main()
15 {
16 int n;
17 while(scanf("%d",&n) && n)
18 {
19 int temp, s;
20 temp = (int)sqrt(n*2);
21 if(n-temp*(temp+1)/2 < 0)
22 temp--;
23 s = temp*(temp+1)*(2*temp+1)/6 + (temp+1)*(n-temp*(temp+1)/2);
24 cout<<n<<' '<<s<<endl;
25 }
26 return 0;
27 }