c语言问题?
3个回答
展开全部
原则上来讲,应该先计算 n!,然后再计算1/n!,再把结时进行加减运算。
但由于计算机自身有数值上限的限制(虽然有大数运算,但这种小程序使用这类技术显然不合适),计算20!的阶乘,结果会超出一般的计算机的数值上限,导致溢出,所以这里采用另一种计算方式。
计算1/n!,循环计算a=1/n, a=a/(n-1), a=a/(n-2)...., a=a/2,这样计算,可以保证不会有溢出问题。所以,代码如下:
#include <stdio.h>
double calc(int n) { //计算1/n!
double r = 1.0;
int m=n;
while (n>1) {
r/=n; n--;
}
return m%2==1?r:-r;
}
int main() {
int n, i;
double r=0.0;
printf("输入n:"); scanf("%d", &n);
for (int i=1;i<=n;i++)
r += calc(i);
printf("%.6f\n", r); //输出r
return 0;
}
//改进思路:上面的代码,其实仍然有改进的地方,每一次计算calc(n)的时候,都是重新计算一次,这样实际上是浪费算力。既然是依次计算1/n!,那么,实际上可以在计算1/(n+1)!的时候,可以利用上一次计算1/n!时的结果。这样,就只需要计算一次r/(n+1)就可以了。改进很简单,我就不再写代码了,可以自行研究一下。
但由于计算机自身有数值上限的限制(虽然有大数运算,但这种小程序使用这类技术显然不合适),计算20!的阶乘,结果会超出一般的计算机的数值上限,导致溢出,所以这里采用另一种计算方式。
计算1/n!,循环计算a=1/n, a=a/(n-1), a=a/(n-2)...., a=a/2,这样计算,可以保证不会有溢出问题。所以,代码如下:
#include <stdio.h>
double calc(int n) { //计算1/n!
double r = 1.0;
int m=n;
while (n>1) {
r/=n; n--;
}
return m%2==1?r:-r;
}
int main() {
int n, i;
double r=0.0;
printf("输入n:"); scanf("%d", &n);
for (int i=1;i<=n;i++)
r += calc(i);
printf("%.6f\n", r); //输出r
return 0;
}
//改进思路:上面的代码,其实仍然有改进的地方,每一次计算calc(n)的时候,都是重新计算一次,这样实际上是浪费算力。既然是依次计算1/n!,那么,实际上可以在计算1/(n+1)!的时候,可以利用上一次计算1/n!时的结果。这样,就只需要计算一次r/(n+1)就可以了。改进很简单,我就不再写代码了,可以自行研究一下。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是一个for语句,根据for语句的形式:for(语句1;语句2;语句3){函数体;}
的执行顺序是:语句1,判断语句2是否成立(非0为真,0为假)函数体,最后是语句3,(£)再进行判断语句2,是否成立,在执行函数体,语句3
,在执行(£)知道条件不满足语句2,跳出循环;如果,语句2是非逻辑表达式,即非判断语句时,循环体内,必有满足条件的跳出语句
break,否则为死循环;
这里的
for(k=1;k+1;k++)
可以这样解释:执行循环for()语句时,初始条件
K=1;之后执行
K+1
(k=2,非0,条件为真继续执行)之后执行函数体for下面花括号{}的内容,之后在执行
K++(K自增1)
所以,明白for()语句的执行顺序就可以明白了,明白了吗?
的执行顺序是:语句1,判断语句2是否成立(非0为真,0为假)函数体,最后是语句3,(£)再进行判断语句2,是否成立,在执行函数体,语句3
,在执行(£)知道条件不满足语句2,跳出循环;如果,语句2是非逻辑表达式,即非判断语句时,循环体内,必有满足条件的跳出语句
break,否则为死循环;
这里的
for(k=1;k+1;k++)
可以这样解释:执行循环for()语句时,初始条件
K=1;之后执行
K+1
(k=2,非0,条件为真继续执行)之后执行函数体for下面花括号{}的内容,之后在执行
K++(K自增1)
所以,明白for()语句的执行顺序就可以明白了,明白了吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以先定义一个函数计算阶乘,然后main函数中使用for循环计算结果。代码如下:
#include<stdio.h>
int jc(int n)
{
if(n==0||n==1) return 1;
if(n>1) return (n*(n-1));
}
int main()
{
int n,sign=1;//sign用来改变正负
float sum=0,temp;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
temp=sign/jc(i);
sign*=-1;
sum+=temp;
}
printf("%.6f",sum);
return 0;
}
#include<stdio.h>
int jc(int n)
{
if(n==0||n==1) return 1;
if(n>1) return (n*(n-1));
}
int main()
{
int n,sign=1;//sign用来改变正负
float sum=0,temp;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
temp=sign/jc(i);
sign*=-1;
sum+=temp;
}
printf("%.6f",sum);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询