`
Sunnie小食
  • 浏览: 54552 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

RUC_JudgeOnline 1003 计算cosx和sinx的近似值

阅读更多

计算cosx和sinx的近似值

Description

遍一个程序计算sinx和cosx的近似值,使用如下的台劳级数:

舍去的绝对值应小于ε

Input

输入文件包括2个实数x,ε,两个数间有一空格。

Output

输出文件共两行
第一行输出sinx的近似值
第二行输出cosx的近似值

Sample Input

 

5 0.001

 

Sample Output

 

-0.958776 0.284221

 

Source

习题06-01

 

问题分析:

这个题目是对公式的理解和实现。通过观察,发现一下的规律。

1.每一项的组成形式是X^K/K!;

2.每一项的符号与K有关。Kmod4为1,4的是正的,Kmod4为2,3的是负的;

3.sin是K为奇数时候的累加,cos是K为偶数时候的累加;

4.对于X的初值的处理,需要将这个数字转换成2*pi以内的数。

解决方案:

用一个while循环控制程序。维护里面的条件是单项的值小于给出的初值。对if进行一个奇数偶数的判断,可以在一个循环中完成对sinx和cosx的叠加分配。我使用了一个子函数item专门来计算每一项的值。在计算的时候使用一个大小为K的循环,来计算X^K/K!。具体的可以见参考程序。

参考程序:

#include<stdio.h>
#include<math.h>
const double pi=3.1415926;             //define pi 

double item(int n);
double x;

int main()
{ 
        scanf("%lf",&x);
        double e;
        scanf("%lf",&e);
        x=x-(floor(x/(2*pi)))*(2*pi);  //change x to 0~2*pi 

        double sinx=0.0;
        double cosx=0.0;
        int n=0;
        double now=item(n);            //here we can change to do……while      

        while(fabs(now)>e)
        {
                 if(n%2==0) {       	     // if n%2==0 cosx+ else sinx+                   
                cosx=cosx+now;
                }
                 else{
                 sinx=sinx+now;
                }
                 n++;
                 now=item(n);
        }
        printf("%lf\n",sinx);
        printf("%lf\n",cosx);
        return 0;
}

double item(int k)
{
        double ans=1.0;
        int i;
        for(i=1;i<=k;i++) {             //here to cal X^K/K!         
                ans*=x;
                ans/=i;
        }
        if(k%4==2||k%4==3)
        {
                ans=-ans;
        }
        return ans;

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics