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 }