求e =1/1!+1/2!+1/3!+……1/n!,直到最后一项小于10-5为止。
#include<stdio.h>
#include<math.h>
void main()
{
int i = 1, n = 1,m;
double z, e ;
e = 0;
while (1)
{
for (m= 1; m<= i; m++)
{
n = n * m;
}
i = i + 1;
z = 1 / n;
e = e + z;
if (z < 0.00001)
{
break;
}
}
printf("%lf", e);
}
这串代码问题在哪?我只是想知道这串代码的问题在哪里,不用重新帮我写新的代码,在这个代码的思路上进行微调就行。
三个问题,用注释标注出来
void main()
{
int i = 1, n,m;
double z, e ;
e = 1; //初始值设为1,你的e的计算公式有误,前面两项都是1,也即是1/0!和1/1!,1/0!不方便写循环可以直接定为初始值
while (1)
{
n=1; //你的n放置是有错误的,每次循环都需要重置为1,然后运行下面的阶乘
for (m= 1; m<= i; m++)
{
n = n * m;
}
i = i + 1;
z = 1.0 / n; //必须加小数点,否则整数除以整数默认地板除(比如1/2=0)
e = e + z;
if (z < 0.00001)
{
break;
}
}
printf("%lf", e);
}
#include<stdio.h>
#include<math.h>
int f(int t)//用递归求阶乘的函数
{
if(t==0)
return 1;
else
return f(t-1)*t;
}
int main()
{
double sum=0;
double flag=-1;
double i=1.0;
int n=0;
while(fabs(i)>=1E-5)
{
sum+=i;
//
i=(flag*1)/f(n);
//printf("%d的阶层值是%d\n",n,f(n));
flag=-flag;
n=n+1;
}
printf("之和是%lf\n",sum);
return 0;
}
e的公式错了,是e =1/0!+1/1!+1/2!+1/3!+…+1/n!
#include <stdio.h>
int main(void) {
//e =1/1!+1/2!+1/3!+……1/n!
float fun(int n);
float gete = 0;
float per;
int i = 0;
do {
per = 1.0 / fun(i);
gete += per;
++i;
} while (per >= 10e-5);
printf("%f\n", gete);
return 0;
}
float fun(int n)
{
if (n == 0) return 1;
else return n * fun(n - 1);
}
首先要想结果是小数,中间所有涉及的数都应该变成小数,我也是刚学,无法认识这个问题最根本的解决方法是什么,但只要将中间涉及的所有数变成小数,就能完美避免这个问题。
然后,判断退出语句有些问题,你把break放在了if语句中,无法得到正确的答案,所以可以增加一个判断值,例如flaag=1。这个是我写的程序,算出来应该是正确答案。
#include <stdio.h>
int main()
{
double i = 1, n = 1,m,flag=1;
double z, e ;
e = 0;
while (flag==1)
{
for (m=1;m<=i;m++)
{
n = n * m;
}
i = i + 1;
z = 1 / n;
e = e + z;
if (z < 0.00005)
{
flag=0;
}
else
flag=1;
}
printf("%lf", e);
return 0;
}
设计一个专门计算阶乘的函数,其次封装一个比较最小值的函数,最后计算加和,这样有层次,问题定位不准确就添加打印信息观察每一步的值变化