**链接:****传送门 **

思路:高精度乘法板子题,高精度耗时又耗空间......


/*************************************************************************
> File Name: hdu1042.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年05月16日 星期二 21时07分58秒
************************************************************************/ #include<bits/stdc++.h>
using namespace std; #define cls(x) memset(x,0,sizeof(x)) const int maxlen = 100000; // 单个“数字”最大长度
class HP{ // High Precision
public:
int len , s[maxlen];
HP(){ (*this) = 0; }; HP(int inte){ (*this) = inte; }; HP(const char*str){ (*this) = str; };
friend ostream & operator << (ostream & cout , const HP &x); // 定义高精度输出方式
HP operator = (int inte); HP operator = (const char*str); // 定义高精度与高精度的 + - * / % Compare(比较)
HP operator + (const HP &b); HP operator - (const HP &b);
HP operator * (const HP &b); HP operator / (const HP &b);
HP operator % (const HP &b); int Compare(const HP &b);
};
ostream & operator <<(ostream & cout, const HP &x){
for(int i = x.len ; i >= 1 ; i--) cout<< x.s[i]; return cout;
}
HP HP::operator = (int inte){
if( inte == 0 ){ len = 1; s[1] = 0; return (*this); };
for( len = 0 ; inte > 0 ;) { s[++len] = inte % 10 ; inte /= 10; };
return (*this);
}
HP HP::operator = (const char* str){
len = strlen(str);
for(int i = 1 ; i <= len ; i++) s[i] = str[len - i] - '0'; // 需要注意
return (*this);
}
HP HP::operator * (const HP &b){
int i , j; HP c; c.len = len + b.len;
for( i = 1 ; i <= c.len ; i++) c.s[i] = 0; // 清空返回值的数组
for( i = 1 ; i <= len ; i++) for( j = 1 ; j <= b.len ; j++) c.s[i+j-1] += s[i]*b.s[j];
for( i = 1 ; i < c.len ; i++){ c.s[i+1] += c.s[i] / 10 ; c.s[i] %= 10; }
while( c.s[i] ){ c.s[i+1] = c.s[i]/10 ; c.s[i] %= 10; i++; }
while( i>1 && !c.s[i] ) i--; c.len = i;
return c;
}
HP HP::operator + (const HP &b){
int i; HP c; c.s[1] = 0;
for( i = 1 ; i<=len || i<=b.len || c.s[i] ; i++ ){ // 模拟十进制加法运算,写的好呀!写的好!巧妙!
if( i <= len ) c.s[i] += s[i];
if( i <= b.len ) c.s[i] += b.s[i];
c.s[i+1] = c.s[i]/10; c.s[i] %= 10;
}
c.len = i - 1 ; if( c.len == 0 ) c.len = 1;
return c;
}
HP HP::operator - (const HP &b){
int i,j; HP c;
for( i = 1, j = 0; i <= len ; i++){
c.s[i] = s[i] - j; if(i <= b.len) c.s[i] -= b.s[i];
if( c.s[i] < 0 ){ j = 1; c.s[i] += 10; }
else j = 0;
}
c.len = len; while( c.len > 1 && !c.s[c.len] ) c.len--;
return c;
}
int HP::Compare(const HP &y){
if( len > y.len ) return 1;
if( len < y.len ) return -1;
int i = len;
while( (i>1) && (s[i]==y.s[i]) ) i--;
return s[i] - y.s[i]; // 如果 s[i] == y.s[i] 自然返回0,s[i] > y.s[i]返回1.....很巧妙!
}
HP HP::operator / (const HP &b){
int i,j; HP d(0) , c;
for( i = len ; i > 0 ; i--){
if( !(d.len==1 && d.s[1]==0) )
{ for( j = d.len ; j > 0 ; j--) d.s[j+1] = d.s[j]; ++d.len; }
d.s[1] = s[i]; c.s[i] = 0;
while( j = d.Compare(b) >= 0 ){
d = d - b; c.s[i]++; if(j==0) break;
}
}
c.len = len ; while( (c.len>1) && (c.s[c.len]==0) ) c.len--;
return c;
}
HP HP::operator % (const HP &b){
int i,j; HP d(0);
for( i = len ; i > 0 ; i--){
if( !(d.len==1 && d.s[1]==0) )
{ for( j = d.len ; j > 0 ; j--) d.s[j+1] = d.s[j]; ++d.len; }
d.s[1] = s[i];
while( j = d.Compare(b) >= 0 ){
d = d - b; if(j==0) break;
}
}
return d;
}
int main(){
int n;
HP ans , tmp;
char s1[maxlen] , s2[maxlen];
while(~scanf("%d",&n)){
if( n == 0 ) printf("1\n");
else{
ans = 1;
for(int i = 1 ; i <= n ; i++){
tmp = i;
ans = ans * tmp;
}
cout<< ans <<endl;
}
}
return 0;
}

HDU 1042 N!( 高精度乘法水 )的更多相关文章

  1. hdu 1042 N!(高精度乘法 + 缩进)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...

  2. hdu 1042 N!(高精度乘法)

    Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   Input One N in ...

  3. hdu 1042 N! 高精度运算

    N!                                                                              Time Limit: 10000/50 ...

  4. Hdu 1042 N! (高精度数)

    Problem Description Givenan integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input OneN in one ...

  5. HDU 1042.N!【高精度乘法】【8月24】

    N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   Input One N ...

  6. [vijos P1040] 高精度乘法

    如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...

  7. 【PKU1001】Exponentiation(高精度乘法)

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 ...

  8. HDU 1042 N! 參考代码

    HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...

  9. Vijos 1040 高精度乘法

    描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...

随机推荐

  1. keepalived+mysql主主实现高可用

    mysql主从配置参考我的上篇博客 主主配置就是互为主从 环境 准备应用 keepalived-2.0.2.tar.gz openssl-devel-1.0.2k-12.el7.x86_64.rpm ...

  2. LIS,LCS,LICS 学习笔记

    1.最长上升子序列(LIS) 子序列: 1.可以不连续 2.相对位置不变 dp[i][j] 表示前i位置,最大值为j的LIS长度 1. dp[i-1][j] 前i-1位置,最大值为j的LIS长度 (没 ...

  3. mongodb--linux下的安装

    linux下ubuntu的安装及启动 sudo apt-get upgrade sudo apt-get udpate sudo apt-get install mongodb 用 命令查看一下mon ...

  4. 操作服务器及MySQL数据库可以使其远程链接

    转自原文操作服务器及MySQL数据库可以使其远程链接 一般情况分三个地方准备,MySQL数据库,防火墙,还有你的服务器主机的准备 操作系统为centos6.5.其他系统大致差不多. 1:在服务器中安装 ...

  5. 根据BDUSS获取用户ID信息

    代码在 /data/svndir/business/workroot2/app/ecom/ubec/getuser

  6. 51nod 1413:权势二进制

    1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一个十进制整数被叫做权势二进制,当他的十进制 ...

  7. Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现

    需求描写叙述 编敲代码.完毕在主机上实现对备机上文件夹及文件的操作. 比如,主机为A,备机为B,要求编写的程序运行在A机上,该程序实如今B机上创建文件文件夹及复制文件的操作. 需求分析 我们先不考虑用 ...

  8. [Android中级]使用Commons-net-ftp来实现FTP上传、下载的功能

    本文属于学习分享,如有雷同纯属巧合 利用业余时间.学习一些实用的东西,假设手又有点贱的话.最好还是自己也跟着敲起来. 在android上能够通过自带的ftp组件来完毕各种功能.这次是由于项目中看到用了 ...

  9. SVN文件恢复

    SVN删除文件 一.本地删除 SVN删除文件里的本地删除,指的是在clientdelete了一个文件,但还没有commit.使用revert来撤销删除. 二.server删除 1.通过本地删除后提交s ...

  10. 【翻译自mos文章】 11gR1版本号 asmcmd的新命令--cp、md_backup、md_restore

    11gR1版本号 asmcmd的新命令--cp.md_backup.md_restore 參考原文: ASMCMD - New commands in 11gR1 (Doc ID 451900.1) ...