蓝桥杯vip题阶乘计算

详细题目


输入一个正整数n,输出n!的值。

其中n!=123n。

算法描述

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题阶乘计算的更多相关文章

  1. Java实现 蓝桥杯VIP 算法提高 计算时间

    算法提高 计算时间 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒.HH,MM,SS均是两位数,如果小于10用0补到 ...

  2. Java实现 蓝桥杯VIP 基础练习 Sine之舞

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...

  3. Java实现 蓝桥杯VIP 基础练习 龟兔赛跑预测

    题目描述 话说这个世界上有各种各样的兔子和乌龟,但是 研究发现,所有的兔子和乌龟都有一个共同的特点--喜欢赛跑.于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔 ...

  4. Java实现 蓝桥杯VIP 基础练习 高精度加法

    java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...

  5. Java实现蓝桥杯VIP 算法训练 找公倍数

    问题描述 这里写问题描述. 打印出1-1000所有11和17的公倍数. 样例输入 一个满足题目要求的输入范例. 样例输出 与上面的样例输入对应的输出. 这道题其实没有什么可写的,但是为了让读者更方便的 ...

  6. 蓝桥杯vip 字符串对比

    蓝桥杯vip 字符串对比 题目如下 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei ...

  7. Java实现 蓝桥杯VIP 基础练习 时间转换

    问题描述 给定一个以秒为单位的时间t,要求用"h️s" 的格式来表示这个时间.H表示时间,M表示分钟,而s表示秒,它们都是整数且没有前导的"0".例如,若t=0 ...

  8. Java实现 蓝桥杯VIP 基础练习 字符串对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

  9. Java实现 蓝桥杯VIP 基础练习 分解质因数

    题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...

随机推荐

  1. php 依赖注入 和 控制反转 php设计模式

    https://blog.csdn.net/zyddj123/article/details/82753650 什么是依赖注入?IOC:英文全称:Inversion of Control,中文名称:控 ...

  2. 《软件自动化测试开发-Java和Python测试开发实用指南》出版了

    1.关于书中下载链接的问题:出现404,页面不存在 解答:大小写要区分,l和1不能弄错了 2.关于勘误,出现极个别漏子少字错字 解答:后续版本会改进,目前能理解就好了 ---------------- ...

  3. Proto3:风格

    本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...

  4. 如何使用隐式转换扩展DataFrame和RDD以及其他的对象

    目的 DataFrame可以点出来很多方法,都是DF内置的. 比如说:df.withColumn(),df.printSchema(). 但是如果你想打印df中的分区位置信息,以及每个key有多少记录 ...

  5. http客户端如何写

    使用wireshark协助,设置网卡本地,设置过滤器:http && (ip.src == 192.168.1.80 && ip.dst == 192.168.1.81 ...

  6. epoll的原理和用法

    设想一个场景,有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收到TCP包)也就是说,在每一时刻进程只需要处理这100万连接中的一小部分连接,那么,如何 ...

  7. 我去,你写的 switch 语句也太老土了吧

    昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意.但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:& ...

  8. 带你学习Javascript中的函数进阶(一)

    1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式function关键字(命名函数) 函数表达式(匿名函数) new Function() var fn = new Function('参数 ...

  9. sofa-bolt源码阅读(1)-服务端的启动

    Bolt服务器的核心类是RpcServer,启动的时候调用父类AbstractRemotingServer的startup方法. com.alipay.remoting.AbstractRemotin ...

  10. 一篇文章带您读懂Map集合(源码分析)

    今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...