(篇四)C语言静态变量法,求各阶乘,的和


本篇仍然是C语言的相关知识,主要分析了用C语言的静态变量来求各个阶乘的和;当然也包括了阶乘和静态变量的相关分析

静态变量求阶乘相加

1、阶乘的概念:

From“科普中国”
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
亦即n!=1×2×3×…×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
阶乘

2、静态变量的概念:

From“科普中国”
静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。

3、静态变量大白话:
(1)说白了静态变量就是作用域无法影响其值的变量,比如在C语言的函数中,形参都是临时变量,函数调用结束后,临时变量的内存空间就会被释放掉;
(2)可是静态变量就不会,它会一直存在,知道整个程序运行结束;
(3)如果你在函数中定义一个静态变量,该静态变量的内存空间也不会随着函数调用结束而消失;
(4)静态变量只能在定义它们的函数中引用,跳出该函数后其值不变,下一次再调用该函数时,其值仍为上次结束时的值
(5)在C语言中,静态变量是由static存储类声明的变量

4、题:
求1到n的阶乘相加

5、分析用静态变量求阶乘:
(1)原本求阶乘就是需要两个变量,一个用来保存每一项阶乘的值,一个用来保存各阶乘的和;
(2)求每一项阶乘中,又需要让前一项阶乘的值保持不变;所以这时候就可以用静态变量来处理;
(3)比如用s来做每一项的阶乘,n2表示该阶乘的下一项数字,则求阶乘的函数中应该用s= s*n2;来求下一项的阶乘;

//求阶乘 
long factor(int n2)
{
	static long s= 1;		
	//定义静态变量s:静态变量只能在定义它们的函数中引用,跳出该函数后其值不变,下一次再调用该函数时***其值仍为上次结束时的值*** 
	
	s= s*n2;
	return s;
}

(4)然后每次返回s的值,加到求和变量sum中,在循环条件下,n2的值会加1,一直加到我们指定的那个值才停,循环结束,求和完成

//求阶乘的和 
long sum(int n1)
{
	int i;
	long sum= 0;
	for(i=1; i<=n1; i++)
	{
		sum += factor(i);
	}
	return sum;
}

6、完整参考代码:

#include <stdio.h>
long factor(int n2);  //函数的声明,一个用静态变量求阶乘,一个用来求各个阶乘的和 
long sum(int n1);

void main()
{
	int n;
	long s;
	printf("请输入n的值:");
	scanf("%d",&n);
	s= sum(n);
	printf("结果为:%d",s); 
}

//求阶乘的和 
long sum(int n1)
{
	int i;
	long sum= 0;
	for(i=1; i<=n1; i++)
	{
		sum += factor(i);
	}
	return sum;
}

//求阶乘 
long factor(int n2)
{
	static long s= 1;		
	//定义静态变量s:静态变量只能在定义它们的函数中引用,跳出该函数后其值不变,下一次再调用该函数时***其值仍为上次结束时的值*** 
	
	s= s*n2;
	return s;
}

6、参考结果:
求阶乘的和
这里的n值是6,算的就是1!+2!+3!+4!+5!+6!
总要算6次阶乘,再加6次
因为有了静态变量,我们就直接使用上一项阶乘的值,而不用重新定义变量,减少了循环,降低了时间复杂度

普通方法求阶乘相加

1、分析:
普通方法就需要用到循环,来求每一项的阶乘;

//求阶乘
long factor(int n2)
{
	int i;
	long s= 1;
	for(i=1; i<=n2; i++)
	{
		s= s*i;
	}
	return s;
}

因为它没有一个变量来保存上一项阶乘的值

2、参考代码:

#include <stdio.h>
long factor(int n2);
long sum(int n1);

void main()
{
	int n;
	long s;
	printf("请输入n的值:");
	scanf("%d",&n);
	s= sum(n);
	printf("结果为:%d",s); 
}

//求阶乘的和 
long sum(int n1)
{
	int i;
	long sum= 0;
	for(i=1; i<=n1; i++)
	{
		sum += factor(i);
	}
	return sum;
}

//求阶乘 
long factor(int n2)
{
	int i;
	long s= 1;
	for(i=1; i<=n2; i++)
	{
		s= s*i;
	}
	return s;
}

3、参考结果:
普通求阶乘和

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙Next

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值