使用C语言求N的阶乘的方法

 更新时间:2015年08月16日 11:52:13   作者:低调小一  
这篇文章主要介绍了使用C语言求N的阶乘的方法,包括一道相关的ACM题目示例,需要的朋友可以参考下

用递归法求N的阶乘

程序调用自身称为递归( recursion).它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解.

递归的能力在于用有限的语句来定义对象的无限集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

long factorial(int n)

{

  if(n == 1)

    return 1;

  else

    return n*factorial(n-1);

}

int main(int argc,char *argv[])

{

  int n = 0;

  if(argc != 2)

  {

    printf("input error,exit!!\n");

    return -1;

  }

  n = atoi(argv[1]);

  printf("%d! = %ld\n",n,factorial(n));

  return 0;

}

习题示例

题目

    题目描述: 
     输入一个正整数N,输出N的阶乘。 
    输入: 
    正整数N(0<=N<=1000) 
    输出: 
     输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 
    样例输入: 
    4 
    5 
    15 
    样例输出: 
    24 
    120 
    1307674368000 

AC代码

  #include <stdio.h> 
  #include <stdlib.h> 
  #include <string.h> 
    
  #define MAX 3000 
    
  //存储每次阶乘运算的结果 
  int str[MAX]; 
    
  void calculateFactorial(int n); 
    
  int main() 
  { 
    int n; 
    
    while (scanf("%d", &n) != EOF) { 
      if(n == 0) { 
        printf("1\n"); 
      } else { 
        calculateFactorial(n); 
      } 
    } 
    
    return 0; 
  } 
    
  void calculateFactorial(int n) 
  { 
    int i, j, temp, c, len; 
    
    memset(str, 0, sizeof(str)); 
    str[1] = 1; 
    
    for (i = 2, len = 1; i <= n; i ++) { //循环与2,3,..n相乘 
      for (j = 1, c = 0; j <= len; j ++) { //str数组代表一个数,模拟与i相乘 
        temp = str[j] * i + c; 
        str[j] = temp % 10; 
        c = temp / 10; 
      } 
      while(c > 0) 
      { 
        str[j ++] = c % 10; 
        c /= 10; 
      } 
      len = j - 1; 
    } 
    
    for (i = len; i >= 1; i --) { 
      printf("%d", str[i]); 
    } 
    printf("\n"); 
  } 

    /**************************************************************
        Problem: 1076
        User: wangzhengyi
        Language: C
        Result: Accepted
        Time:2150 ms
        Memory:916 kb
    ****************************************************************/

相关文章

  • C/C++中获取重载函数地址的方法

    C/C++中获取重载函数地址的方法

    函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表不同,常用来处理实现功能类似数据类型不同的问题,本文给大家介绍了C/C++中获取重载函数地址的方法,需要的朋友可以参考下
    2024-04-04
  • vscode中配置LeetCode插件的教程(愉快刷题)

    vscode中配置LeetCode插件的教程(愉快刷题)

    这篇文章主要介绍了vscode中配置LeetCode插件的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-03-03
  • Qt数据库应用之实现通用数据库分页

    Qt数据库应用之实现通用数据库分页

    数据库分页展示,在所有的涉及到数据库记录的项目中都是需要的。本文将利用Qt实现通用数据库的分页展示,感兴趣的小伙伴可以跟随小编学习一下
    2022-02-02
  • IOS开发之UIScrollView实现图片轮播器的无限滚动

    IOS开发之UIScrollView实现图片轮播器的无限滚动

    这篇文章主要介绍了IOS开发之UIScrollView实现图片轮播器的无限滚动的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++ 中const 类型限定符不兼容问题

    C++ 中const 类型限定符不兼容问题

    这篇文章主要介绍了C++ 中const 类型限定符不兼容问题的相关资料,需要的朋友可以参考下
    2015-06-06
  • C++ 开发之实现操作符重载的实例

    C++ 开发之实现操作符重载的实例

    这篇文章主要介绍了C++ 开发之实现操作符重载的实例的相关资料,这里附有实例代码和实现效果图帮助大家参考实践,需要的朋友可以参考下
    2017-07-07
  • 解读C++11 原生字符串

    解读C++11 原生字符串

    这篇文章主要介绍了C++11 原生字符串的相关资料,帮助大家更好的理解和学习c++11,感兴趣的朋友可以了解下
    2020-08-08
  • C语言实现遍历文件夹中的文件

    C语言实现遍历文件夹中的文件

    这篇文章主要为大家详细介绍了如何使用C语言实现遍历文件夹中的文件,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-02-02
  • C++实现延迟的方法详解

    C++实现延迟的方法详解

    这篇文章主要为大家详细介绍了C++实现延迟的三个方法,文中的示例代码讲解详细,对我们深入了解C++有一定的帮助,感兴趣的小伙伴可以学习一下
    2022-12-12
  • C++任意线程通过hwnd实现将操作发送到UI线程执行

    C++任意线程通过hwnd实现将操作发送到UI线程执行

    做Windows界面开发时,经常需要在多线程环境中将操作抛到主线程执行,下面我们就来学习一下如何在不需要重新定义消息以及接收消息的情况下实现这一要求,感兴趣的可以了解下
    2024-03-03

最新评论