蓝桥杯练习 《阶乘计算》如何处理大数乘法
程序员文章站
2022-05-12 13:40:55
...
题目描述:
思路:
阶乘级别的增长非常恐怖,当n等于1000的时候,位数就达到了2568,明显int和long long 都存不下,只能通过数组的方式进行存储。
原题描述:
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
- 根据描述,最重要的一点就是,当某位数超出9的时候需要进位,可以联想实际中通过草稿纸是如何计算乘法的。
代码如下:
#include <stdio.h>
void carryBit(int j,int result[]){
//判断是否大于9,若大于则进位
if(result[j]>9){
//上位加上整除的结果,本位保留余数
result[j+1]+=result[j]/10;
result[j]%=10;
//因为上位加上数字以后很有可能也超过九,还需对上位进行进位
//可通过递归调用本函数进行
carryBit(j+1,result);
}else{
//递归出口,上位或本位不再大于8
return;
}
}
int main()
{
//n的阶乘,先输入n
int n;
scanf("%d", &n);
//因为得到的结果非常大,通过计算器得知大概有2600位
//为了方便存储,我们将result[0]作为个位,以此往后,并将结果先设置为1
int result[2601] = {1, 0};
//计算过程 i代表从2到n依次相乘的数
for (int i = 2; i <= n; i++)
{
//每一位都需要乘以i,这里需要从最高位开始乘,因为
//如果从低位开始的话,进上来的数还要被再乘一次,导致结果错误
//语言表达能力有限,可能不是很好理解,建议自己试一下。
for (int j = 2600; j >= 0; j--)
{
result[j] *= i;
//如果该位结果最后大于9,则需要进位,可通过一个函数实现
carryBit(j,result);
}
}
//输出结果 需要从最高位输出
for(int i=2600;i>=0;i--){
//从找到第一个不是0的数开始输出
if(result[i]!=0){
for(int j=i;j>=0;j--){
printf("%d",result[j]);
}
printf("\n");
break;
}
}
return 0;
}
推荐阅读