本篇仍然是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、参考结果: