高精度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 ...
随机推荐
- 你知道Windows和WordPress上帝模式吗?
一.Windows 上帝模式 这个玩意出来很久很久了,估计不用多说,知道的同学还是挺多的,不知道的也只要百度一下,你就知道了. 方法很简单,在 Windows 系统任何地方新建一个文件夹,如下命名即可 ...
- 网站被XMR恶意挖矿
发现: 网站首页被恶意更改 网站的关键词和描述被恶意更改 服务器和只要访问此服务器上的网页cup 直线上升100% 排查代码发现js 文件被恶意更改,访问了挖矿网站 操作:删除js 里面的恶意代码,更 ...
- PAT 1016 Phone Bills[转载]
1016 Phone Bills (25)(25 分)提问 A long-distance telephone company charges its customers by the followi ...
- [LeetCode] 513. Find Bottom Left Tree Value_ Medium tag: BFS
Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...
- 1.keras实现-->使用预训练的卷积神经网络(VGG16)
VGG16内置于Keras,可以通过keras.applications模块中导入. --------------------------------------------------------将 ...
- Pycharm上python3运行unittest无法生成测试报告
原文地址https://www.cnblogs.com/yoyoketang/p/7523409.html 前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告:为什么别人 ...
- dedecms开启报错
php.ini里面设置display_errors = On 开启错误提示,error_reporting = E_ALL & ~E_NOTICE 设置错误等级.也可以在php文件中ini_s ...
- JavaScript循环练习
1.蓝球弹起的高度篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10次之后篮球的高度. <script type="text/javascript"> ...
- SV中的数据类型
Verilog-1995中规定的数据类型有:变量(reg), 线网(wire), 32位有符号数(integer), 64位无符号数(time), 浮点数(real). SV扩展了reg类型为logi ...
- CAReplicatorLayer
CAReplicatorLayer CAReplicatorLayer的目的是为了高效生成许多相似的图层.它会绘制一个或多个图层的子图层,并在每个复制体上应用不同的变换.看上去演示能够更加解释这些,我 ...