dotcpp-1066: 二级C语言-自定义函数 (计算项由阶乘和幂次组成的数列和)

/*
输入一个正数x和一个正整数n,求下列算式的值。
x - x^2/2! + x^3/3! + ... + (-1)n-1xn/n!

要求定义两个调用函数:fact(n)计算n的阶乘
mypow(x,n)计算x的n次幂(即x^n),两个函数的返回值类型是double。(×输出保留4位小数)

计算分析:

分解表达式的各项为:符号*分子/分母

该表达式为奇项正,偶项负,
可采用置第一项的前一项为-1,后随循环迭代,由此可达到偶负奇正的符号
或判断循环自变量i来确定当前项的奇偶性

分子为 x^1 x^2 x^3 ... x^n ,则用自定义函数mypow(x,i)即可求得每项值
分母为 1! 2! 3! ... n! ,则用定义的阶乘函数fact(i)即可求得每项值

整个表达式可看作连续项t的累加
t1+t2+t3+ ... +tn

通过写出通项公式,把每一项累加求和即可求得表达式的值

输入
x n

输出
数列和

样例输入
2.0 3

样例输出
1.3333

错误:
答案错误50:
计算阶乘时,返回值写成了int类型,导致输入较大数时返回值精度不够,一直卡在答案错误50
*/

#include <stdio.h>
#include <math.h>

//计算n的阶乘
double fact(int n){
	double f=1;
	for(int i=2;i<=n;i++){
		f*=i;
	}
	return f;
}

//计算x的n次幂
double mypow(double x,int n){
	double x0=x; //保留1次幂

	if(n==0){
		x=1;
	}

	//求n次幂,只需将x^1×x0^n-1(×n-1次x0)
	for(int i=1;i<=n-1;i++){
		x*=x0;
	}

	return x;
}

int main(){
	double x;
	int n;

	//计算表达式:
	//x - x^2/2! + x^3/3! + ... + (-1)^n-1x^n/n!
	while(~scanf("%lf%d",&x,&n)){
		double y,t,f;

		y=0.0;
		f=-1.0;

		for(int i=1;i<=n;i++){
			f=-f;
			//f=mypow(-1,i-1);

			t=f*mypow(x,i)/fact(i);

			y+=t;

			//printf("t(%d)=%.4f  ",i,t);
			//printf("y(%d)=%.4lf\n",i,y);
		}

		printf("%.4lf",y);
	}

    return 0;
}
posted @ 2021-09-23 17:22  windin  阅读(276)  评论(0编辑  收藏  举报