多项式求和
Time Limit: 1000MS
Memory Limit: 65536KB
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
对于每个输入样例,输出多项式和的结果(结果精确到小数点后两位)。每行输出一个结果。
Example Input
2 1 2
Example Output
1.00 0.50
Hint
Author
中国海洋大学第三届“朗讯杯”编程比赛高级组试题
1、因为保留两位小数,大家可能都没有认真想过,如果输入的基数太大的话,做+-求和运算,对于小数点后两位来说已经没有影响了,可能就是5.1012和5.1013的区别(打比方),所以经过测试,到达150的时候就已经对小数点后两位没有影响了,所以只循环150次,强行减少时间复杂度
2、这道题最容易TLE
3、这道题的本意应该是链表问题,以下只是投机取巧罢了
以下为AC代码
#include <stdio.h>
#include <stdlib.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;//注意,150!!甚至更小,但是我没有细分,已经够了
sum = 0;
sign = 1 ;
for(j = 1 ; j <= m ; j++)
{
sum += sign*(1.0/j) ;
sign = -sign ;
}
printf("%.2lf\n", sum);
}
}
/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 152KB
****************************************************/
链表做法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct node
{
double data;
struct node*next;
};
int main()
{
double t,i,sum;
long long int n;
int x;
struct node *head,*tail,*p;
scanf("%lf",&t);
while(t--)
{
sum=0;
scanf("%lld",&n);
x=n;
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
tail=head;
for(i=1; i<=150; i++)
{
p=(struct node*)malloc(sizeof(struct node));
p->data=pow(-1,i-1)*(double)(1/i);
p->next=NULL;
tail->next=p;
tail=p;
}
p=head->next;
if(x>1000)
{
for(i=1; i<=150; i++)//150!!
{
sum=sum+p->data;
p=p->next;
}
}
else for(i=1; i<=x; i++)
{
sum=sum+p->data;
p=p->next;
}
printf("%.2lf\n",sum);
}
return 0;
}