| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2166 人关注过本帖
标题:求助一道关于阶乘的题
只看楼主 加入收藏
c530837027
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-12-8
结帖率:85.71%
收藏
已结贴  问题点数:10 回复次数:14 
求助一道关于阶乘的题
cos(x)=1-(x^2/2!)+(x^4/4!)-(x^6/6!)...............(x为弧度,计算精度为1e-6)

这个怎么编程序呢


input"x" to x
s=1
f=1
n=2
d=-1
do while x^n/f>=1e(-6)
   f=f*(2*n-2)*(2*n-3)
 
 s=s+(x^(2*n-2)/f)*d
 d=-d
 n=n+1
 enddo
 ?s
我这样编的好像错了哦???
2011-12-13 22:11
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:0 
'1e' 指的什么?e为底的对数? 还是别的?我个人还没有接触到这个函数。假如1e(-6)是个是个常量吧。(稍改了你的程序,仅供参考)

input"x" to x
store 1 to s,f
n=2
do while.t.
   f=f*(2*n-2)*(2*n-3)
   s=s+(x^(2*n-2)/f)*(-1)^(n+1)
   if  x^n/f>le(-6) && le(-6)会报错,要换成常数
     exit
   endif
     n=n+1
 enddo
 ?s
 


[ 本帖最后由 qingfameng 于 2011-12-13 23:30 编辑 ]
2011-12-13 23:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
认真分析规律,才是正途。仔细看看每一项的结构,找到稳定的重复规律,就得解了。你看看从第二项开始,都是2、4、6、……这样的循环,还不知道怎么做?

授人以渔,不授人以鱼。
2011-12-13 23:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实你所问3道题本质上都是一样,处理手法也是一样的。前面的说学会了,又再问,其实即是没学会。

授人以渔,不授人以鱼。
2011-12-13 23:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面是我曾经写过的用级数求正弦值的程序代码,你连猜带蒙地看一下思路吧,我不想再写FP代码了,没时间。一样的做法,三道都一样。

程序代码:
/*
    SinX=X/1!-X^3/3!+X^5/5!-X^7/7!+……+(-1)n+1*X^(2n-1)/(2n-1)!
*/

#include <stdio.h>

double pow(const double x, const int n);
double factorial(const int n);

int main(int argc, char* argv[])
{
    double x;                    // 弧度
    int n;                       // 求值项数
    int sign = 0;                // 正负号标志
    double sin = 0.0;            // 计算结果
    double temp;
    int i;

    if (argc < 3)
    {
        printf_s("格式: %s x n\n", argv[0]);
        printf_s("其中,x是弧度制角度,n是多项式项数,n=0不计算,结果为零。\n");
        printf_s("举例 Sin 1.5 20\n");
        return -1;
    }

    sscanf_s(argv[1], "%lf", &x);
    sscanf_s(argv[2], "%d", &n);

    if (n < 0)
    {
        printf_s("错误:n = %d\n", n);
        return -2;
     }

    for (i = 1; i <= n; ++i)
    {
        sign = !sign;
        temp = pow(x, 2 * i - 1) / factorial(2 * i - 1);
        if (sign)
        {
            sin += temp;
        }
        else
        {
            sin -= temp;
        }
    }

    printf_s("Sin(%.2f) = %.16f\n", x, sin);

    return 0;
}

// 计算x^n
double pow(const double x, const int n)
{
    int i;
    double ret_value = 1.0;

    for (i = 0; i < n; ++i)
    {
        ret_value *= x;
    }

    return ret_value;
}

// 计算n!
double factorial(const int n)
{
    int i;
    double ret_value = 1.0;

    for (i = 1; i <= n; ++i)
    {
        ret_value *= (double)i;
    }

    return ret_value;
}

授人以渔,不授人以鱼。
2011-12-13 23:50
c530837027
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-12-8
收藏
得分:0 
关于VFp我都是自学。。。
2011-12-14 00:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
等会我给你写一个吧,详细讲解你以后怎么做。学编程要学会思考和处理的手法,把复杂情形分拆为若干简单情形的组合。拆解、构造重用代码,是编程的核心思想。像你上面,试图把所有代码混在一个程序段,那是很糟糕的,情形再复杂一点,就死翘翘了。

授人以渔,不授人以鱼。
2011-12-14 01:07
c530837027
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-12-8
收藏
得分:0 
回复 5楼 TonyDeng
也许你觉得问题很白痴,但是关于VFp我都是自学,也只能猜一猜你的高见了呵呵
2011-12-14 01:09
c530837027
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-12-8
收藏
得分:0 
回复 2楼 qingfameng
呵呵,是10的-6次方,该是1e-6额
2011-12-14 01:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
*-----------------------------------
*     题目:运用级数收敛求余弦值
* 级数公式:Cos(x) = 1 - x^2 / 2! + x^4 / 4! - ……+ (-1)^n·x^2n / (2n)!
* 结束条件:末项值 < 1e(-6)
*     备注:1.因VFP有指数运算符^,所以无需自编幂运算函数
*           2.注意控制输入的弧度值不要超过60,此时级数项至n=85,将导致阶乘溢出双精度数范围。
*-----------------------------------
SET DECIMALS TO 18
CLEAR
Input "请输入弧度 x = " to nAngle
nCosine = 0.0            && 余弦初值
nIndex = 0                && n计数器
nSign = 1                && 正负号
DO WHILE .T.
    nItem = nAngle ^ (2 * nIndex) / Factorial(2 * nIndex)        && 计算每项,n=0开始
    nCosine = nCosine + nSign * nItem                            && 把每项的值累加到结果
    IF nItem <= 1E-6                                            && 当某项的绝对值满足结束条件时终止循环
        EXIT
    ENDIF
    nIndex = nIndex + 1
    nSign = -nSign                                                && 反转每项的正负号
ENDDO
? "Cos(", nAngle, ") = ", nCosine
RETURN 

* 求自然数n的阶乘
FUNCTION Factorial(n)
    LOCAL nIndex, nReturnVal
   
    * 如果n是数值型数据且大于等于零则进行运算,否则返回零(正常阶乘值不会等于零的)
    IF (VARTYPE(n) == "N") .AND. (n >= 0)
        nReturnVal = 1
        FOR nIndex = 1 TO n
            nReturnVal = nReturnVal * nIndex
        NEXT
    ELSE
        nReturnVal = 0
    ENDIF
   
    * 计算结果返回到调用处
    RETURN nReturnVal
   
ENDFUNC


[ 本帖最后由 TonyDeng 于 2011-12-14 02:16 编辑 ]

授人以渔,不授人以鱼。
2011-12-14 02:06
快速回复:求助一道关于阶乘的题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020025 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved