蓝桥杯基础练习VIP-阶乘计算(C语言)

蓝桥杯刷题014——求阶乘(二分法) 没有白走的路,每一步都算数! 阅读详情

题目描述

输入一个正整数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

思路

用递归的方法将n的阶乘的每个数字相乘,用高精度计算得到带有结果的数组

设立递归函数,将乘数与高精度数组每一位相乘,得到结果的个位保留在数组内,超出个位的部分存储起来,加入到下一位的计算中,计算完毕后递归到下一位乘数,最终返回数组位数

我的函数内将乘数按位数分成了数组,再分别计算,其实不用这一步,将乘数直接与高精度数相乘就可以,在计算的范围内,而且简单方便

起始代码

#include<stdio.h>

int compute(int* a, int k, int n) {
	if (k == 1||k==0)
		return n;//返回位数
	int i, j;
	int b[4];//现有数字高精度表示
	int c[10000] = { 0 };//记录相乘后的结果
	int thisK = k;
	int thisN = n;//记录结果的位数
	int carry = 0;//记录进位
	int thisI = 0;//记录这个数的位数

	while (thisK > 0) {//将数字按位数拆成数组
		b[thisI] = thisK % 10;
		thisK /= 10;
		thisI++;
	}
	for (i = 0;i < thisI;i++) {//位数依次相乘
		carry = 0;
		for (j = 0;j < n;j++) {//两数组相加
			c[i + j] = c[i + j] + b[i] * a[j] + carry;
				carry = c[i + j] / 10;//进位
				c[i + j] = c[i + j] % 10;//当前值
		}
		if (carry > 0) {//最大一位超出
			c[i + j] += carry;
			carry = 0;
			j++;
		}
		if (i + j > thisN) {//最高位数
			thisN = i + j;
		}
		
	}
	
	for (i = 0;i < thisN;i++) {
		a[i] = c[i];
	}
	return compute(a, k - 1, thisN);
}

int main() {
	int n;
	int a[10000] = { 0 };
	scanf("%d", &n);
	int i = 0;
	int k = n;
	while (k > 0) {//计入到高精度位中
		a[i] = k % 10;
		k = k / 10;
		i++;
	}
	k=compute(a, n - 1, i);

	for (i = k - 1;i >= 0;i--) {
		printf("%d", a[i]);
	}
	return 0;
}

优化后的结果

#include<stdio.h>

int compute(int* a, int k, int n) {
	if (k == 1||k==0)
		return n;//返回位数
	int i;
	int thisN = n;//记录结果的位数
	int carry = 0;//记录进位
	
	for (i = 0; i < n; i++) {
		a[i] = a[i] * k + carry;

		carry = a[i] / 10;//总体进位
		a[i] = a[i] % 10;//这一位的结果
	}
	while (carry>0) {//进位
		a[thisN] = carry % 10;
		carry /= 10;
		thisN++;
	}

	return compute(a, k - 1, thisN);
}

int main() {
	int n;
	int a[10000] = { 0 };
	scanf("%d", &n);
	int i = 0;
	int k = n;
	while (k > 0) {//计入到高精度位中
		a[i] = k % 10;
		k = k / 10;
		i++;
	}
	k=compute(a, n - 1, i);

	for (i = k - 1;i >= 0;i--) {
		printf("%d", a[i]);
	}
	return 0;
}

蓝桥杯VIP习题及答案基础练习(C语言) 因为报名了蓝桥杯省赛,所以写下这个博客来记录学习 一、基础训练 阶乘计算 问题描述 输入一个正整数n,输出n!的值。   其中n!=123*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 ... 阅读详情

相关推荐

蓝桥杯C/C++VIP试题每日一练之阶乘计算

蓝桥杯每日一练第十七天阶乘计算。

静Yu的博客 4310

Python输出的方法与格式详细总结(print与stdout)

Python输出的方法与格式详细总结(print与stdout)

qq_56177238的博客 2万+

SLAM轨迹评估神器evo实战:从GPS到TUM格式的完整转换指南(附Python代码)

本文详细介绍了如何使用evo工具将GPS数据转换为TUM格式,以便进行SLAM轨迹评估。通过Python代码实现GPS到笛卡尔坐标的精确转换,并提供了完整的处理流程和实战案例,帮助开发者轻松完成从原始GPS数据到精确轨迹评估的全过程。特别适用于ORB-SLAM等视觉SLAM算法的性能验证。

weixin_29074295的博客 292

蓝桥杯 大数阶乘 ---------C语言—菜鸟级

问题 1474: [蓝桥杯][基础练习VIP]阶乘计算 时间限制: 1Sec 内存限制: 128MB 提交: 106 解决: 59 题目描述 输入一个正整数n,输出n!的值。 其中n!=1*2*3*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 ...

Five—菜鸟级的博客 999

量子密钥分发系统的工程实践(四):FPGA在后处理中的核心实现与优化

本文深入探讨了FPGA在量子密钥分发(QKD)系统后处理中的核心实现与优化策略。文章详细拆解了FPGA如何高效完成原始密钥提取、误码协商和私密放大等关键任务,并分享了流水线设计、资源复用及存储器架构优化等工程实践“心法”,旨在解决高速、实时QKD系统中的性能瓶颈,提升密钥生成率。

t8u9v0的博客 387

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 405

阶乘末尾蓝桥杯java_蓝桥杯基础练习 阶乘计算(JAVA)

问题描述输入一个正整数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!的值。 ...

weixin_42717586的博客 292

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7894

蓝桥杯大赛VIP试题精选集1_E15阶乘算法

蓝桥杯大赛VIP试题精选集1_E15阶乘算法 输入一个正整数n,输出n!的值。其中n!=123*…*n。 算法描述   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n...

qq_43461268的博客 251

动态规划法:n*m方格前进问题

在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 算法设计: 可以使用动态规划方法,从顶部开始,将第二排的每个数加上顶部第一排的最优解,将6排的问题缩小为5排的问题,然后重复该操作,直到底部最后一排,此时

Winifred_1997的博客 4675

030、自动白平衡AWB实战:灰度世界、完美反射与色温估计的工程实现与局限

本文深入探讨了自动白平衡(AWB)算法在工程实践中的实现与局限性。作者结合实际项目经验,分析了灰度世界算法、完美反射算法和色温估计三种主流方法的优缺点和适用场景,并分享了调试过程中的关键技巧和常见陷阱。文章指出,纯色背景、多光源环境等特殊场景容易导致算法失效,需要通过混合策略和场景检测来优化。作者强调AWB调试需要大量实际场景测试,建议保留手动调节功能,并针对不同硬件配置进行参数标定。最后提出,AWB优化是一个持续迭代的过程,需要工程化的测试方法和数据处理能力。

zzfmlxs的博客 280

C语言作业用函数编程计算阶乘,[蓝桥杯][基础练习VIP]阶乘计算 (C语言代码)...

解题思路: 首先,题目中已经给了我们算法的大概思想,高精度计算,用数组实现。首先我们要知道数组每一个位置存该大数的一个数位 如果用char类型的数组,可以减小内存开销,但是须要处理字符与数字变换问题,由于本人比较懒,所以直接用了int类型的数组处理方法就按题目中给的方法来:第一步:开辟好数组空间,这里我使用全局变量的方式,因为全局变量允许申请的连续空间要比局部变量长(原因我也不知道,也是偶然一次编...

weixin_42367148的博客 557

【IoT】 产品设计之结构设计:如何设计产品按键

1、硅胶按键功能实现有两种接触方式 1)硅胶按键按压在DOME片(锅仔片)上 通常用在手机、儿童手表手机、防水手机等防水设备上。 2)硅胶按键增加导电基,一种黑色的导电碳粒,实现回路导电 通常用在遥控器、电脑键盘、特殊设备上。 两种方式结构设计原理是一样的,按键的固定与配合间隙与行程要确保好。 2、硅胶遥控器按键的结构方式(导电基) 按键帽为大颗粒实心的,触点为黑色导电基,通过压注成型融合为一体,那么这种按键结构设计时需要注意那些呢? 最主要的是按键按压回弹的手感,由于没有DOME片实现

产品线负责人 8664

求助 蓝桥杯VIP基础练习 阶乘计算

求求路过的大佬了QAQ 原题 问题描述   输入一个正整数n,输出n!的值。   其中n!=123*…*n。 算法描述   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。   首先将a设为1,然后乘2,乘3,...

qq_43610112的博客 273

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++蓝桥杯 基础练习之阶乘计算

C++ 蓝桥杯题目讲解汇总(持续更新) 这应该是除了数的读法之外,所有的基础练习到此告一段落,接下来需要取学习更多的算法,不断的去提高,向着 蓝桥杯——算法训练环节开冲咯,小白一定会变大白的,奥里给???? VIP试题 阶乘计算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 输入一个正整数nnn,输出n!n!n!的值。   其中 n!=1∗2∗3∗…∗nn!=1*2*3*…*n...

Lurker_hunter的博客 1578

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[蓝桥杯][基础练习VIP]阶乘计算

[蓝桥杯][基础练习VIP]阶乘计算 题目描述 输入一个正整数n,输出n!的值。 其中n!=123*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n时,...

A_dmin的博客 660

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

蓝桥杯练习系统-基础练习34道题解答答案全汇总(c/c++)

蓝桥杯练习系统BASIC-13 数列排序(c++,利用sort) 蓝桥杯练习系统BASIC-12 十六进制转八进制(c++,利用string) 蓝桥杯练习系统BASIC-11 十六进制转十进制(c++,利用流) 蓝桥杯练习系统BASIC-10 十进制转十六进制(c++,利用流) 蓝桥杯练习系统BASIC-9 特殊回文数(c++利用流和字符串) 蓝桥杯练习系统BASIC-8 回文数(c++,超简洁,利用流和字符串) 蓝桥杯练习系统BASIC-7 特殊的数字(c++,利用流和string) 蓝桥练习系统BASI

weixin_53037232的博客 5783

蓝桥杯Python这一篇就够了-训练系统题库合集(包括VIP试题)&数据结构与算法

第一版写于2020-11-13,第十一届蓝桥杯国赛前夕,老师和同学建议说写博文可以让学习更高效,陆陆续续写一些题解和学习笔记,在我的代码中我加了很多有助于理解程序的注释,希望这篇博客可以帮助你在蓝桥杯比赛或python学习取得进展。 一起进步,冲! 目录一、蓝桥杯题库1.1入门训练1.2基础练习 一、蓝桥杯题库 1.1入门训练 Fibonacci数列 圆的面积 序列求和 A+B问题 1.2基础练习 数列排序 十六进制转八进制 十六进制转十进制 ...

Harry______的博客 12万+

蓝桥杯试题集试题总汇(C++)

蓝桥杯试题总汇(C++) 基础练习 BASIC-30 VIP试题 阶乘计算 高精度 ...

行秋的博客 1万+

蓝桥杯C++——试题 基础练习 阶乘计算(VIP试题)

问题描述 输入一个正整数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!的值。 输入格式 ...

行秋的博客 1406

[蓝桥杯][基础练习VIP]阶乘计算--题解C代码(高精度)

[蓝桥杯][基础练习VIP]阶乘计算 时间限制: 1Sec 内存限制: 128MB 提交: 1948 解决: 858 题目描述 输入一个正整数n,输出n!的值。 其中n!=123*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 输入 输入包

koqiu的博客 456

python蓝桥杯基础练习vip17题

python蓝桥杯基础练习vip17题

qq_51184727的博客 638

蓝桥杯基础练习所有VIP习题解析代码

试题 基础练习 阶乘计算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述   输入一个正整数n,输出n!的值。   其中n!=123*…*n。 算法描述   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注...

覃会程的博客 6237

蓝桥杯Java——基础练习VIP

1.阶乘计算 资源限制 时间限制: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!的值。 输入格式   输..

WHT869706733的博客 548

蓝桥杯——阶乘计算

蓝桥杯——阶乘计算 vip Java BigInteger multiplyByInt 大数乘法

许帅的博客 796
上一篇: 蓝桥杯基础练习VIP-回形取数(C语言)
下一篇: 蓝桥杯基础练习VIP-高精度加法(C语言)
Ehell
博客等级 码龄4年 23粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值