Problem Description
多项式描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 ……
先请你求出多项式前n项的和。
Input
第一行输入一个数T代表测试数据个数(T<=1000)。接下来T行每行1个数代表n(0<=n< 2^31)。
Output
对于每个输入样例,输出多项式和的结果(结果精确到小数点后两位)。每行输出一个结果。
Sample Input
2
1
2
Sample Output
1.00
0.50
Hint
Source
中国海洋大学第三届“朗讯杯”编程比赛高级组试题
tip: 做这道题的我开了一个大数组,结果tle,然后用动归,还是tle,头皮发麻。最后发现当到了某一定的值之后,输出的结果不会再发生改变,就是当n=150的时候(大佬发现的),所以就简单了(承受不住)。
ac代码如下:
#include<bits/stdc++.h>
using namespace std;
#define n 150
struct sdut
{
double date;
sdut *next;
}*head,*q,*p,*tail;
sdut *Creat()
{
head=(sdut *)malloc(sizeof(sdut));
tail=head;
int j=0;
for(int i=1;i<=n;i++)
{
p=(sdut *)malloc(sizeof(sdut));
if(i%2==0)
{
p->date=(-1.0/i);
p->next=NULL;
tail->next=p;
tail=p;
}
else
{
p->date=1.0/i;
p->next=NULL;
tail->next=p;
tail=p;
}
}
return (head);
}
int main()
{
int i,t;
int k;
head=Creat();
scanf("%d",&t);
while(t--)
{
scanf("%d",&k);
if(k>150)
k=150;
double sum=0;
int flag=1;
p=head->next;
while(p&&flag)
{
if(flag<=k)
{
sum+=p->date;
flag++;
p=p->next;
}
else
flag=0;
}
printf("%.2lf\n",sum);
}
}
tip:我们这题目要求要用链表,也可不利用链表:
#include<bits/stdc++.h>
int main()
{
int i , j , n , m , sign = 1 ;
double sum ;
scanf("%d", &n);
for(i =1 ; i<= n ; i++)
{
scanf("%d", &m);
if(m > 150) m = 150;
sum = 0; sign = 1 ;
for(j = 1 ; j <= m ; j++)
{
sum += sign*(1.0/j) ;
sign = -sign ;
}
printf("%.2lf\n", sum);
}
}