一道不知道错在哪里的c程题,达人帮忙看看

来源:百度知道 编辑:UC知道 时间:2024/09/22 07:43:12
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入精度eps,根据下式求 PI 的值,直到最后一项小于eps。
PI/2=1+1/(1*3)+2!/(1*3*5)+3!/(1*3*5*7)+...+n!/(1*3*5*...*(2n+1))
要求定义并调用函数 fact(n)计算 n!,函数形参n的类型是int,函数类型是double;定义并调用函数 multi(n)计算 1*3*5*...*n,函数形参n的类型是int,函数类型是double。
输入输出示例:括号内是说明
输入:
2 (repeat=2)
1E-6 (eps=1E-6)
1E-5 (eps=1E-5)
输出示例:
PI = 3.14159
PI = 3.14158
题目要求完毕

自己写的如下
#include <stdio.h>
double fact(int n);
double multi(int n);
int main(void)
{
int i;
int repeat, ri;
double eps, sum, item;

scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%le", &eps);
sum=1;
i=1;
item=1;
while(item>=eps){
item=fact(i)/multi(i);
sum=sum+item;
i++;
}
printf("PI = %0.5f,%f,%f\n", 2 * sum,fact(i)

你这些函数都是错的:

double multi(int n)
{
int i,m;
m=1;
for(i=1;i<=(2*n+1);i=i+2)
m=m*i;
return m;
}

double fact(int n)
{
int i,f;
f=1;
for(i=1;i<=n;i++)
f=f*i;
return f;
}

返回类型要是double,那么里面的变量m和f都应该定义为double,否则结果超过int的32767就会出现负数,这两个函数应该修改为:

double multi(int n)
{
int i;
double m=1;
for(i=1;i<=(2*n+1);i=i+2) m=m*i;
return m;
}

double fact(int n)
{
int i;
double f=1;
for(i=1;i<=n;i++) f=f*i;
return f;
}

另外,你程序里面的输入语句是scanf("%d", &repeat); 这就只能输入整数,你输入1e-6肯定是无法正确工作的。