蓝桥杯BASIC-30 阶乘计算
本文是我的第一篇文章,此题是一道比较基础的大数乘法问题,仅用于CSDN文章发布测试。
题目
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*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
解题思路
该题是一道基础的大数乘法题,没什么技术难度,唯一要注意的一点是由于在C++中数组元素为空和为数值0是一样的,且阶乘结果中可能存在0因此在此题中不能用数组元素是否为空来确定数组的长度;我采用的方法是将所有的数组元素都初始化为-1,在判断时若数组元素为-1则认为该元素为空。
代码
#include <iostream>
using namespace std;
int bigMul(int a[], int b){ //大数乘法;a是被乘数,用数组表示;b是乘数,用int表示
int c = 0; //c存储进位值
int i;
bool flag = false;
for(i=0; a[i]!=-1 || c!=0; i++){
if(a[i]==-1)
a[i]=0;
a[i] = a[i]*b + c;
c = a[i]/10;
a[i] = a[i]%10;
flag = true;
}
return i;
}
int main() {
int n;
int a[10000];
for(int i=0; i<10000; i++){
a[i] = -1;
}
int length;
a[0] = 1;
cin>>n;
for(int i=1; i<=n; i++){
length = bigMul(a, i);
}
for(int i=length-1; i>=0; i--){
cout<<a[i];
}
cout<<endl;
return 0;
}
本人代码水平垃圾,望大佬们轻喷。