最近整理了曾经写的程序,把n的阶乘三种实现方法与小伙伴们分享,希望能给初学者一些帮助。

1、递归

#include <stdio.h>
int Fact(int n);
int main()
{int number,result;                 //number 为待输入的数,计算number的阶乘 printf("please input number");scanf("%d",&number);result=Fact(number);printf("%d的阶乘是%d",number,result);return 0;
}
int Fact(int n)                         //递归函数
{int res=n;if(n>1)res=res*Fact(n-1);return res;
}

2、栈(递归的本质,实现基于栈这一存储方式)

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct SeqStack{                       //定义控制单元 int MAXNUM;int t;DataType *s;
};
typedef struct SeqStack *PSeqstack;      // 此处,实际上是定义一种数据类型(struct SeqStack *),返回指针。可以理解为返回struct SepStack 的地址, //函数声明
int Fact(int n);
PSeqstack createEmptyStack_seq(int m);           //创建空栈
void Push_seq(PSeqstack pstack,DataType x);     //入栈函数
DataType isEmptyStack_seq(PSeqstack pstack);    //判断栈是否为空的函数
DataType top_seq(PSeqstack pstack);             //取栈顶元素的函数
void pop_seq(PSeqstack pstack);                 //出栈函数 int main()
{PSeqstack pstack;                        //用于存放控制单元的地址 int n,MUL;      printf("Please input the value of n:");scanf("%d",&n);MUL=Fact(n);     //计算n的阶乘,值赋给MULprintf("%d",MUL);return 0;
}
int Fact(int n)
{int res;PSeqstack st;st=createEmptyStack_seq(n);          //创空栈,返回指针(指向控制单元的地址),赋给st while(n>0)                           //如果n大于0,就继续将元素压栈 {Push_seq(st,n);               n=n-1;             }res=1;while(!isEmptyStack_seq(st))        //如果栈不空 ,则取栈顶元素 ,然后将从栈中弹出此元素 {res=res*top_seq(st);pop_seq(st);}free(st);                       //释放空间 return res;                    //返回n的阶乘
}PSeqstack createEmptyStack_seq(int m)                  //创建空栈
{PSeqstack pstack=(PSeqstack)malloc(sizeof(struct SeqStack));if(pstack!=NULL){pstack->s=(DataType *)malloc(sizeof(DataType)*m);if(pstack->s){pstack->MAXNUM=m;pstack->t=-1;return pstack;}}
}
void Push_seq(PSeqstack pstack,DataType x)
{if(pstack->t>=pstack->MAXNUM-1)        //压栈时,判断栈元素是否已满 printf("Overflow!\n");else{pstack->t=pstack->t+1;pstack->s[pstack->t]=x;}
}
int isEmptyStack_seq(PSeqstack pstack)   //判空函数,判断栈顶变量是否为-1
{if(pstack->t==-1)return 1;elsereturn 0;
}
DataType top_seq(PSeqstack pstack)
{if(pstack->t==-1)printf("It is empty\n");else{return (pstack->s[pstack->t]);   //返回栈顶元素 }}
void pop_seq(PSeqstack pstack)
{if(pstack->t==-1)printf("Underflow\n");elsepstack->t=pstack->t-1;        //出栈函数,元素出栈后,栈顶变量减1
}

3 for循环

#include <stdio.h>
int main()
{int i,n,Mul;Mul=1;printf("请输入n值:");scanf("%d",&n);for(i=n;i>0;i--){Mul=Mul*n;n=n-1;}printf("%d",Mul);        //打印n的阶乘Mul
}

这些程序都比较简单,初学C语言的话,可能第二个程序比较费劲,学了数据结构自然就不存在问题了。

n的阶乘三种实现方法(C语言)相关推荐

  1. PHP开发之递归算法的三种实现方法

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...

  2. 黑马程序员_Java解析网络数据流的三种特殊方法

    Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...

  3. Oracle的join默认为,Oracle中的三种Join方法详解

    这里将为大家介绍Oracle中的三种Join方法,Nested loop join.Sort merge join和Hash join.整理出来以便帮助大家学习. 基本概念 Nested loop j ...

  4. python中保留小数_python保留小数位的三种实现方法

    前言 保留小数位是我们经常会碰到的问题,尤其是刷题过程中.那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此这里介绍几种比较简单实用的保留小数位的方法: 方法一:fo ...

  5. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  6. lopa分析_【风险分析方法】HAZOP、LOPA和FMEA三种分析方法,如何做到信息共享?...

    导 读 信息是人们对事物的了解的不确定性的减少或消除,其功能是表征物质客体成分,结构,状态,特性等属性.信息共享的目的在于减少或消除信息源所需的不确定性.石油化工行业由于设备多,生产过程复杂,危险元素 ...

  7. php怎么四舍五入,php 四舍五入的三种实现方法

    这篇文章主要为大家详细介绍了php 四舍五入的三种实现方法,具有一定的参考价值,可以用来参考一下. 对php 四舍五入的三种方法感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! php 四 ...

  8. java map集合遍历方法,Java的Map集合的三种遍历方法

    集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 1. package com.myTest.MapText; import java.util.Collection; i ...

  9. for-forEach-stream.forEach三种遍历方法

    java8新出的循环方式,在网上有大量的道友说用流的方式效率反而更低了. 大量的结论表明,这种方式只是语法糖(for-forEach-stream三种遍历方法执行效率比较与选用思考 - ZZY1078 ...

最新文章

  1. Scrapy八小时快速入门第一小时:安装,创建与执行我们的Scrapy爬虫
  2. Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property
  3. Golang 常见设计模式之选项模式
  4. C# WinFrom 去掉groupbox的边框
  5. 开箱即用Bumblebee独立部署搭建webapi网关详解
  6. html:(14):给div命名和table标签
  7. 2016年下半年勒索软件数量翻倍
  8. 新年了,我也来kuso一下.......(yy帖~~)
  9. f3 fatfree小型php,F3-fatfree小型php框架教程(三)
  10. 如何利用FME转换空间坐标系
  11. 杭电 oj 1006 Tick and Tick 个人题解
  12. FeignClient中每一个@RequestParam 都要设置value,否者报错
  13. 纵向数据中抑郁检测与预测的深度多任务学习
  14. 蓝牙耳机什么牌子音质好听?蓝牙耳机音质排行榜
  15. 4种 LBS “附近的人” 实现方案,人人都能看的懂
  16. U盘怎么量产 怎么对U盘进行量产
  17. 壁纸 | iOS 14 内置这几张壁纸,你喜欢吗?
  18. Android Studio 从入门到精通视频教程
  19. 什么是Java Applet
  20. 达摩达兰论估价pdf_《故事与估值:商业故事的价值》pdf文字版下载

热门文章

  1. 第12期 【鸟随鸾凤飞腾远】 7月刊
  2. NAT与PAT的区别
  3. Linux 平台 LiveSuitV3.05 工具使用说明
  4. Oracle普通索引和唯一索引
  5. 【对讲机的那点事】手把手教你安装公网4G对讲机读写频的驱动及写码?
  6. 220V转12V成熟设计 6W,包含原理图和pcb,附芯片手册,包含变压器设计
  7. autodesk genuine service卸载不掉
  8. 用msi安装包安装MySQL详细步骤
  9. 数字化工厂解决方案——OA办公自动化与ERP
  10. MATLAB求复数的实部和虚部