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