高精度N的阶乘-N!
题目:输入一个正整数N(0<N<=30),求N!
代码:
#include<stdlib.h>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int a[2005]={0};
int main()
{
int n,i,j,t=0,sum=0,b=0;//t represent carry bit
cin>>n;
a[1]=1;
for(i=2;i<=n;i++)
{
for(j=1;j<=2000;j++)//enough bit to store the number
{
sum=a[j]*i+t;//each bit x i
a[j]=sum%10;//finished bit number
t=sum/10;//turn to the next bit
}
}
if(n==1)cout<<"1";
else
{ for(j=2000;j>=1;j--)
{
if(a[j]!=0)b=1;
if(b==1)cout<<a[j];
}
}
return 0;
}
/*
24
x 5
----
120
abc
*/
说句实在的,这题我解决了很久,思路并没有像我想的那样快速而又灵活。
定义一个大数组a存储位数,这题很明显如果使用普通的递归函数调用或者用一个for循环暴力解决会使最终的数据超过int的32位整数范围。
那么思路这时就比较清晰:用数组存储每一位的位数,最后输出这个数组。
使用了两个for循环来模拟N!
第一个for循环:
for(i=2;i<=n;i++)模拟与数i相乘。
第二个for循环:for(j=1;j<=2000;j++)遍历数组中存储的每一位,在我第一次想到他的时候,问题在于取定j的范围,也就是最后结果的N!的位数。
这样去做太过麻烦,我做了两三次尝试无果,最后发现只需定义一个比较大足以容得下最大的N!的位数即可。
第二个for循环中的语句:
for(j=1;j<=2000;j++)//enough bit to store the number
{
sum=a[j]*i+t;//each bit x i
a[j]=sum%10;//finished bit number
t=sum/10;//turn to the next bit
}
这里来说明几个变量的意义:1.sum 是位数和数i的乘积与进位数t之和 2.
a[j]存储位数 3.t代表进位数
sum=a[j]*i+t;在阶乘的过程中,从小的位数到大的位数依次乘以此时的数i,sum存储此时第j位位数与i相乘之后再加上进位数t的和。
a[j]=sum%10;位数保留sum的个位数。
t=sum/10;进位数t=sum/10。
举个例子:24*5 先对24的个位4进行处理,4乘以5等于20,此时sum=20,留下的位数为0,进位数t=2;再对十位数2进行处理,2乘以5等于10,此时的sum=2x5+t=10+2=12,保留个位数字2为位数,进制数t=12/10=1;那么下一次执行的时候,sum=0+t=1,
a[j]=1,t=0。实际上对数字位数的遍历操作已经结束了。
此时保证了在遍历数组元素(位数)的过程中,不会发生越界的现象,我在刚刚开始的时候对所有数组的元素赋值0,保证不会出现奇怪的错误和多位的情况。
最后输出的时候,用一个状态变量b,判断是否遇到了我们存储的“最大的”位数,是的话开始输出。
高精度N的阶乘-N!的更多相关文章
- n的阶乘高精度算法【阶乘】
C语言实验——求阶乘(循环结构) Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu ...
- 百度松果菁英班OJ【连载】
第十六周 2 的 n 次幂 高精度乘法 #include<bits/stdc++.h> using namespace std; vector<int> mul(vector& ...
- AC日记——阶乘之和 洛谷 P1009(高精度)
题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...
- 中石油-高精度阶乘-java
问题 F: [高精度]高精度阶乘 时间限制: 1 Sec 内存限制: 64 MB提交: 49 解决: 13[提交][状态][讨论版] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为 ...
- 洛谷 P1009 阶乘之和 Label:高精度
题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...
- ALGO-157_蓝桥杯_算法训练_阶乘末尾(高精度)
问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 样例输出 数据规模和约定 n<=, ...
- bzoj 3907 网格 bzoj2822 [AHOI2012]树屋阶梯——卡特兰数(阶乘高精度模板)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 https://www.lydsy.com/JudgeOnline/problem.p ...
- nyoj 65-另一种阶乘问题 (Java 高精度)
65-另一种阶乘问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:16 提交数:18 难度:1 题目描述: 大家都知道阶乘这个概念,举个简单的例子:5!=1*2*3*4*5.现在 ...
- 【洛谷】P1009 阶乘之和——高精度算法
题目描述 用高精度计算出S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) 其中"!&qu ...
随机推荐
- mysql 数据库数据订正
mysql 数据库数据订正 http://blog.itpub.net/22664653/viewspace-717175/ 工作过程中时常遇到数据订正的需求,该操作本身不难.操作时要求能够保持回滚~ ...
- Python3学习之路~2.1 列表、元组操作
列表 列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 定义列表(list) names=['Amy','Bob','Cindy','David'] 通过下标访问列 ...
- Atom编辑器折腾记
http://blog.csdn.net/bomess/article/category/3202419/2 Atom编辑器折腾记_(1)介绍下载安装 Atom编辑器折腾记_(2)基础了解使用 Ato ...
- 关hashMap跟hashTable的区别
1.HashMap和Hashtable都实现了Map接口 2.HashMap是非synchronized,而Hashtable是synchronized 3.HashTable使用Enumeratio ...
- [py]约瑟夫问题-循环队列
约瑟夫问题(历史战争问题) 直观理解 老外视频讲解 模拟器演示 约瑟夫问题 数学姥公众号 讲的最清楚 背景及,推倒过程讲解得很清晰,旨在提高人们对数据的兴趣 简单说下: 几个人围成一圈(循环队列), ...
- POJ3087:Shuffle'm Up(模拟)
http://poj.org/problem?id=3087 Description A common pastime for poker players at a poker table is to ...
- IE加载项
加载项 加载项也称为ActiveX控件.浏览器扩展.浏览器帮助应用程序对象或工具栏,可以通过提供多媒体或交互式内容(如动画)来增强对网站的体验. 但是,某些加载项可导致计算机停止响应或显示不需要的 ...
- unity3D中 material中tiling和offset属性解释
贴图有可能是多行多列的一些图案组成的.当我们需要一帧,一帧的播放时候.也就是帧序列动画, 我们就需要用到tiling和offset两个属性, 默认图片的左下角为坐标圆点即:(0,0) tiling是图 ...
- ac1008
这题说的是 给了n个点在圆 上 然后 i连 i+2 从i+2 开始连 i+4 然后 这样一直到某个点 已经被连过为止 如果还有的没有被连过 就从那个点开始 连 按照上面的规则 当 N大于6 的时 ...
- LINUX环境变量(一)
Linux 的变量可分为两类:环境变量和本地变量 环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux 的环境变量具有继承性,即子 ...