因为痛,所以叫青春

我有一个梦想:穷屌丝变身富屌丝
poj 2000Gold Coins
 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 }
View Code

 

posted on 2013-05-21 11:39  Nice!  阅读(263)  评论(0编辑  收藏  举报