HDU 1042 N!(高精度乘)
题目大意:求N的阶乘。
思路:用高精度,内存存不下这么多只能每次都重新算了……
代码(3093MS):
- //模板测试
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <algorithm>
- using namespace std;
- const int MAXN = ;
- struct bign {
- int len, s[MAXN];
- bign () {
- memset(s, , sizeof(s));
- len = ;
- }
- bign (int num) { *this = num; }
- bign (const char *num) { *this = num; }
- void clear() {
- memset(s, , sizeof(s));
- len = ;
- }
- bign operator = (const int num) {//数字
- char s[MAXN];
- sprintf(s, "%d", num);
- *this = s;
- return *this;
- }
- bign operator = (const char *num) {//字符串
- for(int i = ; num[i] == ''; num++) ; //去前导0
- if(*num == ) --num;
- len = strlen(num);
- for(int i = ; i < len; ++i) s[i] = num[len-i-] - '';
- return *this;
- }
- bign operator + (const bign &b) const {
- bign c;
- c.len = ;
- for(int i = , g = ; g || i < max(len, b.len); ++i) {
- int x = g;
- if(i < len) x += s[i];
- if(i < b.len) x += b.s[i];
- c.s[c.len++] = x % ;
- g = x / ;
- }
- return c;
- }
- bign operator += (const bign &b) {
- *this = *this + b;
- return *this;
- }
- void clean() {
- while(len > && !s[len-]) len--;
- }
- bign operator * (const bign &b) {
- bign c;
- c.len = len + b.len;
- for(int i = ; i < len; ++i) {
- for(int j = ; j < b.len; ++j) {
- c.s[i+j] += s[i] * b.s[j];
- }
- }
- for(int i = ; i < c.len; ++i) {
- c.s[i+] += c.s[i]/;
- c.s[i] %= ;
- }
- c.clean();
- return c;
- }
- bign operator *= (const bign &b) {
- *this = *this * b;
- return *this;
- }
- bign operator *= (const int &b) {//使用前要保证>len的位置都是空的
- for(int i = ; i < len; ++i) s[i] *= b;
- for(int i = ; i < len; ++i) {
- s[i + ] += s[i] / ;
- s[i] %= ;
- }
- while(s[len]) {
- s[len + ] += s[len] / ;
- s[len] %= ;
- ++len;
- }
- return *this;
- }
- bign operator - (const bign &b) {
- bign c;
- c.len = ;
- for(int i = , g = ; i < len; ++i) {
- int x = s[i] - g;
- if(i < b.len) x -= b.s[i];
- if(x >= ) g = ;
- else {
- g = ;
- x += ;
- }
- c.s[c.len++] = x;
- }
- c.clean();
- return c;
- }
- bign operator -= (const bign &b) {
- *this = *this - b;
- return *this;
- }
- bign operator / (const bign &b) {
- bign c, f = ;
- for(int i = len - ; i >= ; i--) {
- f *= ;
- f.s[] = s[i];
- while(f >= b) {
- f -= b;
- c.s[i]++;
- }
- }
- c.len = len;
- c.clean();
- return c;
- }
- bign operator /= (const bign &b) {
- *this = *this / b;
- return *this;
- }
- bign operator % (const bign &b) {
- bign r = *this / b;
- r = *this - r*b;
- return r;
- }
- bign operator %= (const bign &b) {
- *this = *this % b;
- return *this;
- }
- bool operator < (const bign &b) {
- if(len != b.len) return len < b.len;
- for(int i = len-; i >= ; i--) {
- if(s[i] != b.s[i]) return s[i] < b.s[i];
- }
- return false;
- }
- bool operator > (const bign &b) {
- if(len != b.len) return len > b.len;
- for(int i = len-; i >= ; i--) {
- if(s[i] != b.s[i]) return s[i] > b.s[i];
- }
- return false;
- }
- bool operator == (const bign &b) {
- return !(*this > b) && !(*this < b);
- }
- bool operator != (const bign &b) {
- return !(*this == b);
- }
- bool operator <= (const bign &b) {
- return *this < b || *this == b;
- }
- bool operator >= (const bign &b) {
- return *this > b || *this == b;
- }
- string str() const {
- string res = "";
- for(int i = ; i < len; ++i) res = char(s[i]+'') + res;
- return res;
- }
- };
- istream& operator >> (istream &in, bign &x) {
- string s;
- in >> s;
- x = s.c_str();
- return in;
- }
- ostream& operator << (ostream &out, const bign &x) {
- out << x.str();
- return out;
- }
- bign ans;
- void solve(int n) {
- ans.clear();
- ans.len = ans.s[] = ;
- for(int i = ; i <= n; ++i) ans *= i;
- cout<<ans<<endl;
- }
- int main() {
- int n;
- while(scanf("%d", &n)!=EOF) {
- //cout<<f[n]<<endl;
- solve(n);
- }
- return ;
- }
HDU 1042 N!(高精度乘)的更多相关文章
- hdu 1042 N!(高精度乘法 + 缩进)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...
- hdu 1042 N!(高精度乘法)
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in ...
- Hdu 1042 N! (高精度数)
Problem Description Givenan integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input OneN in one ...
- hdu 1042 N! 高精度运算
N! Time Limit: 10000/50 ...
- HDU 1042 N! 參考代码
HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...
- HDU 1042 大数阶乘
B - 2 Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- HDU 1042.N!【高精度乘法】【8月24】
N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...
- HDU 1042 N!( 高精度乘法水 )
链接:传送门 思路:高精度乘法板子题,高精度耗时又耗空间...... /**************************************************************** ...
- HDU 1042 N!(高精度阶乘、大数乘法)
N! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submi ...
随机推荐
- ExcludeClipRect区域裁剪问题
CPaintDC dc(this); CRect rt1; CPen newPen; newPen.CreatePen(PS_SOLID,1,RGB(0,0,0)); CPen *pOldPen = ...
- 【模板】负环(spfa)
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- IO流,字节流
/** * IO流,字节流 */ import java.io.FileInputStream; import java.io.FileOutputStream; public class ByStr ...
- es6 Proxy对象详解
Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...
- php bug 调试助手 debug_print_backtrace()
debug_print_backtrace() 是一个很低调的函数,很少有人注意过它. 不过当我对着一个对象调用另一个对象再调用其它的对象和文件中的一个函数出错时,它也许正在一边笑呢 如果我们想知道某 ...
- Mac下PHP的环境搭建
* 前段时间手欠 ... 入手了一个二手的Macbook pro ! 配置挺高的 16款13寸的基本顶配了 ... 只差 硬盘不是1T的 ... 可以脑补一下配置了* 话说 不是所有程序猿都说 每个程 ...
- Python学习手册之__main__ 模块,常用第三方模块和打包发布
在上一篇文章中,我们介绍了 Python 的 元组拆包.三元运算符和对 Python 的 else 语句进行了深入讲解,现在我们介绍 Python 的 __main__ 模块.常用第三方模块和打包发布 ...
- python网络编程之协程
本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的 ...
- idea自动生成testNG.xml
下载插件 Create TestNG Xml 安装插件 重启后就可以生成testNG.xml,打开xml,ctrl + ALT + L,格式化一下
- git改密码出现授权问题
git修改密码后显示Authentication failed for …… ,意思就是电脑修改密码后导致和git账户密码不匹配 解决方法: