c++阶乘计算

这段求阶乘代码的双重循环看不太懂,能详细解释一下吗?问题描述输入一个正整数n,输出n!的值。其中n!=1*2*3*…*n。算法描述n!可能很大,而计算机能表示的整数范围有... 这段求阶乘代码的双重循环看不太懂,能详细解释一下吗?
问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800
#include <iostream>

#include <cstring>

using namespace std;

const int maxn=3000;

int f[maxn];

int main()

{

int i,j,n;

cin>>n;

memset(f,0,sizeof(f));

f[0]=1;

for (i=2;i<=n;i++)

{

int c=0;

for (j=0;j<maxn;j++)

{

int s=f[j]*i+c;

f[j]=s%10;

c=s/10;

}

}

for (j=maxn-1;j>=0;j--)

if(f[j])

break;

for (i=j;i>=0;i--)

cout<<f[i];

return 0;

}
展开
 我来答
天方之夜谭
2018-07-16 · TA获得超过587个赞
知道小有建树答主
回答量:223
采纳率:100%
帮助的人:212万
展开全部
这个问题可以这样理解,数字是由表示数值的字符,和相应的一个排列组成的,而这个字符在通常情况下是由一个字符组成的,比如0~9,a~z,A~Z,单是这种表示方法无论如何都是有限制的,因为人为创造的计算机用的单个字符是有限的。那么可以用一个数组表示一个数字,而数组中的一个元素表示一个数字的字符,每个元素同样可以使用一个数组来表示,这样循环下去,就成了一个无限大的数字了。但是这样的数字,在计算过程中,需要自己去考虑符号、进位、借位、溢出、等计算问题。你所给出的代码就是一种这样的表达形式。
将一个数表示为多个位数组成的一个数组(f[]),乘法按照由低位到高位,当前位(f[j])和某一数(i)相乘,得到一个结果(s),这个结果和当前位的最大值做除法,商为高一位的数值,也就是进位(c),余数为此位的数值;此时如果高一位的数值仍然大于该位的最大值,继续做除法,商为更高一位的数值,余数(s%10)为该位的数值,以此类推。也就是内循环所表示的意思。
外循环所表示的就是从1开始连续做乘法,一直乘到n。
下边那个循环是将结果输出。
不过就目前看来你所给出的代码,仍然有溢出的问题,最大只能表示一个3000位的十进制数字。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式