蓝桥杯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时,即得到了n!的值。
- 测试输入
10
- 测试输出
3628800
解题方案一
一开始比较呆逼,直接模拟的,主要是太拘泥于传统纸上的计算方式。
#include<iostream>
using namespace std;
const int MAXN = 30000;
typedef struct save {
int data[MAXN];
int length;
string t_name;
}Save;
Save T1, T_1, T_2,T_3;
long long test_num = 1;
//存储初始值
void save_to_T1(int n) {
T1.length = 0;
while(n>0){
T1.data[T1.length++] = n % 10;
n /= 10;
}
/*测试*/
//cout << "T1目前的长度为" << T1.length << endl;
//cout << "T1内部的数据为" << endl;
//for (int i = 0; i < T1.length; ++i) {
// cout << T1.data[i];
//}
//cout << endl;
}
//切片得k值
void kill_to_k(int& k1, int& k2, int& k3, int n ) {
k1 = n % 10;
n /= 10;
k2 = n % 10;
n /= 10;
k3 = n % 10;
/*测试*/
//cout << "k1:" << k1<<" " << "k2:" << k2 <<" "<< "k3:" << k3<<" " << endl;
}
//求 T_1, T_2,T_3
void how_to_T(int k,Save& T) {
int temp = 0; //紧致数
for (int i = 0; i < T1.length; ++i) {
int t = T1.data[i] * k + temp;
temp = t / 10;
T.data[T.length++] = t % 10;
}
if (temp != 0) {
T.data[T.length++] = temp ;
}
/*测试*/
//cout << "临时"<<T.t_name<<"的数据为:" << endl;
//for (int i = 0; i < T.length; ++i) {
// cout << T.data[i];
//}
//
//cout << endl;
}
//求length 最长的值
int chose_max_long(int k1,int k2 ,int k3){
if (k3 >0) {
//cout << "最大值是t3.吗" << T_3.t_name;
return T_3.length;
}
else if (k2 > 0) {
//cout << "最大值是t2吗" << T_2.t_name;
return T_2.length;
}
else {
//cout << "最大值是t1吗" << T_1.t_name;
return T_1.length;
}
}
//完成累加到T1
void sum_to_T(int max_long) {
T1.length = 0;
int temp = 0;
for (int i = 0; i < max_long; ++i) {
int t = T_1.data[i] + T_2.data[i] + T_3.data[i] + temp;
temp = t / 10;
T1.data[T1.length++] = t % 10;
}
if (temp != 0) {
T1.data[T1.length++] = temp;
}
}
/*结果测试*/
void show_result() {
//cout << endl;
for (int i = T1.length - 1; i >= 0; --i) {
cout << T1.data[i];
}
}
int main() {
T1.length = 0;
T1.data[0] = 0;
T_1.t_name = "T1";
T_2.t_name = "T2";
T_3.t_name = "T3";
int n;
cin >> n;
save_to_T1(n);
//从n-1乘到2就行了
for (int i = n - 1; i >= 2; --i) {
int k1 = 0, k2 =0 , k3 = 0;
kill_to_k(k1, k2, k3, i);
T_1.length = 0;
T_2.length = 1;
T_3.length = 2;
how_to_T(k1,T_1);
how_to_T(k2,T_2);
how_to_T(k3,T_3);
int z =chose_max_long(k1,k2,k3);
/*测试*/
//cout << "最大长度为:" << z << endl;
sum_to_T(z);
//show_result();
}
show_result();
return 0;
}
写的又长又烂虽然ac了
方案二
参考网友的,整体方案还是模拟但是,向前进位的时候直接进就好了。
#include <iostream>
using namespace std;
const int maxn = 10000;
int T1[maxn] = { 1 };
int temp = 1,k = 0 ; //T1的存储长度
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; ++i) {
for (int j = 0; j <temp; ++j) {
T1[j] = T1[j] * i + k;
k = T1[j] / 10;
T1[j] = T1[j] % 10;
if (j == temp-1 && k != 0) {
++temp;
}
}
}
//逆序输出
for (int i = temp-1; i >= 0; --i) {
cout << T1[i];
}
return 0;
}
蓝桥杯vip题阶乘计算的更多相关文章
- Java实现 蓝桥杯VIP 算法提高 计算时间
算法提高 计算时间 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒.HH,MM,SS均是两位数,如果小于10用0补到 ...
- Java实现 蓝桥杯VIP 基础练习 Sine之舞
问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...
- Java实现 蓝桥杯VIP 基础练习 龟兔赛跑预测
题目描述 话说这个世界上有各种各样的兔子和乌龟,但是 研究发现,所有的兔子和乌龟都有一个共同的特点--喜欢赛跑.于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔 ...
- Java实现 蓝桥杯VIP 基础练习 高精度加法
java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...
- Java实现蓝桥杯VIP 算法训练 找公倍数
问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...
- 蓝桥杯vip 字符串对比
蓝桥杯vip 字符串对比 题目如下 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei ...
- Java实现 蓝桥杯VIP 基础练习 时间转换
问题描述 给定一个以秒为单位的时间t,要求用"h️s" 的格式来表示这个时间.H表示时间,M表示分钟,而s表示秒,它们都是整数且没有前导的"0".例如,若t=0 ...
- Java实现 蓝桥杯VIP 基础练习 字符串对比
问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...
- Java实现 蓝桥杯VIP 基础练习 分解质因数
题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...
随机推荐
- java处理数据库date类型数据
1.使用Date类和TimeStamp类的valueOf转换时间 Date.valueOf(); TimeStamp.valueOf(); 如果这两种转换直接用在sal语句上,那么最外层要 ...
- 配置gitlab(备忘)
已经配置好github的基础上,clone gitlab 地址git status 显示改变了的文件但是webstorm文件颜色不改变问题的解决:VCS->git-->remotes--& ...
- hibernate需要注意的点
1.需要用Hibernate做实体的类(@Entity)需要在配置文件中配置对应的包(例如:spring/appContext-hibernate.xml). 2.hibernateTemplate中 ...
- ASP.NET MVC4网站搭建与发布【最新】
ASP.NET MVC4网站搭建与发布 一些往事 2015年,仅仅大二的我怀着一颗创业之心,加入了常熟派英特,成为阳光职场平台的创始之一,并肩负了公司技术部的大梁,当时阳光职场正在从线下服务向互联网化 ...
- sql性能优化浅谈
sql性能优化总结: 最近随着数据越来越多,数据库性能问题暴露的越来越严重.几百万,上千万,甚至过亿的数据处理速度会非常的慢. 下面对工作中遇到的问题做下总结,希望以后能对日后的工作有所帮助. 不同的 ...
- 吴裕雄--天生自然KITTEN编程:翻译机
- Emacs和ESS的使用技巧。
1. 安装ESS 有两种方法可以安装,一种是直接使用系统自带的包安装系统,比如yum: # yum install emacs-ess 但是,有时可能不是ESS最新版本.所以,推荐第二种方法,使用Em ...
- Hi3518_SDK
第一章 Hi3518_SDK_Vx.x.x.x版本升级操作说明 如果您是首次安装本SDK,请直接参看第2章. 第二章 首次安装SDK 1.Hi3518 SDK包位置 在"Hi3518_V10 ...
- Docker实战之MySQL主从复制
前言 曾几何时,看着高大上的架构和各位前辈高超的炫技,有没有怦然心动,也想一窥究竟?每当面试的时候,拿着单应用的架构,吹着分库分表的牛X,有没有心里慌的一批? 其实很多时候,我们所缺少的只是对高大上的 ...
- Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解
题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...