蓝桥杯练习题|蓝桥杯 基础训练--阶乘计算(高精度)、高精度加法


蓝桥杯 基础训练--阶乘计算(高精度)

  • 题目
  • 代码及注释
  • 核心算法理解
  • 其他题目

题目 问题描述
输入一个正整数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
代码及注释
#include #include .h> #include .h> #include #include .h> #define max 4000 using namespace std; int main () { int n; cin>>n; int a[max]; memset(a,0,sizeof(a)); //数组所有为初始化为0 // 实现阶乘和存储 int jw=0,t=0; a[0]=1; //大数a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 for(int i=2; i<=n; i++) {//n的阶乘n次循环 for(int j=0; j=0; k--) {//逆序寻找第一个不为0的位 if(a[k]!=0) break; } //逆序输出 for(int g=k; g>=0; g--) { cout<

核心算法理解 蓝桥杯练习题|蓝桥杯 基础训练--阶乘计算(高精度)、高精度加法
文章图片

其他题目 【蓝桥杯练习题|蓝桥杯 基础训练--阶乘计算(高精度)、高精度加法】问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a + b的值。
#include #include .h> #include .h> #include #include .h> #define max 103 //本题难点在大数的输入 与 倒序存入数组 using namespace std; int main(){ char a[max],b[max]; scanf("%s",a); scanf("%s",b); //数组a b 正序存入的两个大数 例如12223 1 int as[max],bs[max],c[max]; //as bs 倒序存入的两个大数32221 1;c存最后结果 memset(as,0,sizeof(as)); memset(bs,0,sizeof(bs)); memset(c,0,sizeof(c)); //字符数组a--》 整数数组as(倒序) ; 字符数组b--》 整数数组bs(倒序) for(int i=0; i=0; d--){ if(c[d]!=0) break; } //逆序输出c for(int e=d; e>=0; e--){ cout<

    推荐阅读