高精度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中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...
- [LeetCode] 104. Maximum Depth of Binary Tree_Easy tag: DFS
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- 如何用softmax和sigmoid来做多分类和多标签分类
首先,说下多类分类和多标签分类的区别 多标签分类:一个样本可以属于多个类别(或标签),不同类之间是有关联的,比如一个文本被被划分成“人物”和“体育人物”两个标签.很显然这两个标签不是互斥的,而是有关联 ...
- Java接口多线程并发测试 (一)
本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...
- 关闭Oracle 11g的DPR特性
关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter event NAME TYPE VALUE ------ ...
- PIMPL(一)
1 参考 <effective C++> 条款31:将文件间的编译关系降至最低 PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom 2 什么是PI ...
- linux中vim的常用方法
i 当前光标位置插入 a 当前光标后插入 0 另起一行插入 A 在光标所在行尾插入 I 在光标所在行首插入 :set nu设置 行号 :set nunu 取消行号 gg 到第一行 G 到最后一行 $ ...
- uva1494 最小生成树--例题
这题说的是n个城市 建路 使他们联通然后 , 可以使用一条超级的路这条路不计入总长,此时路长度为B, 这条路链接的两个城市人口与和为A+B, 然后计算出最大的A/B 解题 先生成一颗最小生成树,然后 ...
- 20155334 2016-2017-2 《Java程序设计》第八周学习总结
20155334 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章:NIO与NIO2 NIO的定义: InputStream.OutputStream ...
- 修練營ASP.NET]淺談多層式架構 (Multi Tiers)
從需求談起 我們舉個小例子來理解一般的方式與多層的方式有何不同 假設:我需要顯示最近三個月內,所有營業員的銷售金額成績排名 一般的做法: 在一個畫面中,拉個GridView,一個SqlDataSouc ...