多项式求和(投机取巧法+链表法)

来源:互联网 发布:360拒绝安装软件 编辑:程序博客网 时间:2024/06/05 05:40

多项式求和

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

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

212

Example Output

1.000.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: AcceptedTake time: 0msTake 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;}


原创粉丝点击