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;
}