蓝桥杯 基础训练--阶乘计算(高精度)
- 题目
- 代码及注释
- 核心算法理解
- 其他题目
题目 问题描述
输入一个正整数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<
推荐阅读
- 蓝桥杯练习题|分解质因数
- 蓝桥杯练习题|【无标题】
- 《LeetCode算法全集》|?算法入门?《二分枚举》中等03 —— LeetCode 1539. 第 k 个缺失的正整数
- 《LeetCode算法全集》|?算法入门?《二分枚举》简单13 —— LeetCode 1351. 统计有序矩阵中的负数
- 算法|二分查找与移除元素(JavaScript语言实现)
- 算法|挂了腾讯3面,拿到字节四面offer,谈谈我的大厂面经!
- LeetCode|LeetCode剑指 Offer 03. 数组中重复的数字python3 3种解法
- 剑指offer|剑指 Offer 03. 数组中重复的数字(简单)
- 经典程序|数据结构之用栈来解决括号匹配问题(Java实现)