可怕的阶乘

2023-12-20 11:18
文章标签 阶乘 可怕

本文主要是介绍可怕的阶乘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出
详细描述:


接口说明

原型:
void CalcNN(int n, char *pOut)
输入参数:
int n 需要计算的阶乘数
输出参数:

char *pOut 结算结果,内存由调用者负责管理

      

 具体计算算法如下:

1、定义一个足够的大的数组array[1000],用来存储计算结果的每一位数;

2、从数组第一位array[o]开始,临时变量int temp 存储数组每一位数与当前阶乘数的运算的结果,记得加上上一位的进位数。 结果 = array[j] * 被乘数 +进位

3、处理每一个结果,只保留个位数 array[j] = temp % 10

4、计算进位数,结果加入数组下一位元素相乘结果。重复步骤2,直到遍历当前数组每一个元素;

5、当前数组成员遍历完毕,处理最后一位进位数,可能不止一位,要进行循环处理,每进一位,数组长度增加一个;

6、进入下一个阶乘数,继续上述步骤,直到阶乘完成。

7、转换成字符数组。

代码如下:

void CalcNN(int n, char *pOut)
{if (n<0||n>100||pOut==NULL){return;}if (n==0||n==1){pOut[0]=1;pOut[1]='\0';return;}int array[1000]={0};array[0]=1;int carry=0;int length=1;int temp=0;for (int i=2;i<=n;i++){carry=0;for (int j=0;j<length;j++){temp=array[j]*i+carry;array[j]=temp%10;carry=temp/10;}while (carry){array[length]=carry%10;length++;carry=carry/10;}}int j=0;for (int i=length-1;i>=0;i--){pOut[j]='0'+array[i];j++;}pOut[j]='\0';return;
}


这篇关于可怕的阶乘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515841

相关文章

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

【LeetCode】:面试题 16.05. 阶乘尾数

🎁个人主页:我们的五年 🔍系列专栏:C++课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章   好久没有写文章了,今天碰见了一道有趣的题目,写下来分享一下。 🏆1.问题描述:  🏆2.问题分析: 🎲优化一: 首先看到这道题的时候,暴力肯定是不行的,n的阶乘可能会是一个很大的数,肯定是会超过int,long long的范围的。 然后再去想其他的方法优

C/C++的阶乘求和以及变量存储数据大小

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 其实刚学C语言的时候,打击都会先认识,类型,像int,double之类的存储类型。在这篇文章中,就需要大家对这个大小有了解。 2. 正文 2.1 问题 题目描述: 一个正整数如果等于组成它的各位数字的阶乘之和,该整数

Java如何计算一个数的阶乘末尾有多少个零?

文章有点长,请耐心看完~~~ 这个问题涉及到阶乘(factorial)的一个有趣特性,即阶乘结果末尾零的数量。要理解这一点,我们首先要知道什么情况下一个数的末尾会产生零。 什么情况下一个数的末尾会产生零 在十进制数制中,一个数的末尾要有零,那么这个数必须能被10整除。而10是由2和5相乘得到的(10=2×5)。因此,为了在一个数中找到末尾的零,我们需要找到这个数中因子2和因子5的对数(也就是

Shell函数:递归函数、阶乘和函数库

文章目录 递归函数示例1:阶乘计算示例2:递归列出目录 函数库 递归函数 递归是指函数在其内部调用自身。递归函数常用于解决像阶乘、斐波那契数列等问题。 示例1:阶乘计算 阶乘(Factorial)是数学中的一种运算,表示从1乘以2乘以3…直到某个数n的乘积,记作n!。 例如: 4! = 1×2×3×4 = 24 (24是4的阶乘)6! = 1×2×3×4×5×6

大整数问题,乘法,加法,阶乘

//大整数相乘 //c[i+j] += a[i]*b[j];数组的每一位相乘然后相加,并得到最终结果 //再考虑进位问题  #include <string.h> #include <stdio.h> #define SIZE 50 int a[SIZE],b[SIZE],c[SIZE*2]; void big_multi(int a[],int b[],int c[]

RISC-V汇编实现矩阵阶乘

1) 源代码  long long fact(long long n) {if (n < 1) return 1;else return (n*fact(n - 1));} 2) 汇编代码  fact:addi sp, sp, -16 // adjust stack for 2 itemssd x1, 8(sp) // save the return add