蓝桥杯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也是从小到 ...
随机推荐
- php 依赖注入 和 控制反转 php设计模式
https://blog.csdn.net/zyddj123/article/details/82753650 什么是依赖注入?IOC:英文全称:Inversion of Control,中文名称:控 ...
- 《软件自动化测试开发-Java和Python测试开发实用指南》出版了
1.关于书中下载链接的问题:出现404,页面不存在 解答:大小写要区分,l和1不能弄错了 2.关于勘误,出现极个别漏子少字错字 解答:后续版本会改进,目前能理解就好了 ---------------- ...
- Proto3:风格
本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...
- 如何使用隐式转换扩展DataFrame和RDD以及其他的对象
目的 DataFrame可以点出来很多方法,都是DF内置的. 比如说:df.withColumn(),df.printSchema(). 但是如果你想打印df中的分区位置信息,以及每个key有多少记录 ...
- http客户端如何写
使用wireshark协助,设置网卡本地,设置过滤器:http && (ip.src == 192.168.1.80 && ip.dst == 192.168.1.81 ...
- epoll的原理和用法
设想一个场景,有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收到TCP包)也就是说,在每一时刻进程只需要处理这100万连接中的一小部分连接,那么,如何 ...
- 我去,你写的 switch 语句也太老土了吧
昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意.但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:& ...
- 带你学习Javascript中的函数进阶(一)
1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式function关键字(命名函数) 函数表达式(匿名函数) new Function() var fn = new Function('参数 ...
- sofa-bolt源码阅读(1)-服务端的启动
Bolt服务器的核心类是RpcServer,启动的时候调用父类AbstractRemotingServer的startup方法. com.alipay.remoting.AbstractRemotin ...
- 一篇文章带您读懂Map集合(源码分析)
今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...