HDU 1042 N!( 高精度乘法水 )
**链接:****传送门 **
思路:高精度乘法板子题,高精度耗时又耗空间......
/*************************************************************************
> 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!( 高精度乘法水 )的更多相关文章
- 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! 高精度运算
N! Time Limit: 10000/50 ...
- Hdu 1042 N! (高精度数)
Problem Description Givenan integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input OneN in one ...
- HDU 1042.N!【高精度乘法】【8月24】
N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...
- [vijos P1040] 高精度乘法
如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...
- 【PKU1001】Exponentiation(高精度乘法)
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 145642 Accepted: 35529 ...
- HDU 1042 N! 參考代码
HDU 1042 N! 题意:给定整数N(0 ≤ N ≤ 10000), 求 N! (题目链接) #include <iostream> using namespace std; //每一 ...
- Vijos 1040 高精度乘法
描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...
随机推荐
- 报错The jarsigner could not be found. Make sure to run with the build with a JDK。的解决方法
这种报错是因为eclipse启动时没有走你设置的jdk路径,eclipse走的路径/bin下没有jarsigner.exe.所以报错,解决办法: 指定eclipse启动jdk 按住alt键,用鼠标拖动 ...
- JavaScript进阶【四】JavaScript中的this,apply,call的深入剖析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 常用前端布局,CSS技巧介绍
常用前端布局,CSS技巧介绍 对前端常用布局的整理总结,并对其性能优劣,兼容等情况进行介绍 css常用技巧之可变大小正方形的绘制 1:若通过设置width为百分比的方式,则高度不能通过百分比来控制. ...
- linux下RTP编程(使用JRTPLIB)(转)
流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议.IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关键 ...
- Python-基础-day1
一.python的介绍 1.python的出现与应用场景 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯 ...
- 导入项目后下载jar包问题理解
1.导入,然后你下载的jar包,jar下载成功,并不代表你项目里的代码就能用这个jar包了. 你必须还要本地添加进classpath.必须手动添加进类路径 2.总结就是:下载jar包是下载jar包,添 ...
- 用户体验之如何优化你的APP
用户体验,速度为王,来几个优化APP“速度”的建议. 1.后台执行 毋庸多言,已是通常做法. 一般在执行下载任务时让其在后台运营,让用户有精力去做别的事情. 后端加载 2.提前显示 客户端与WEB的数 ...
- c#基于udp实现的p2p语音聊天工具
原创性申明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/40124773假设进行转载请注明出处.本文作者原创,邮箱zhujunx ...
- 【智能家居篇】wifi网络结构(上)
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! WIFI是什么.相信大家都知道,这里就不作说明了. 我们须要做的是深入了解其工作原理,包含软硬件.网络结构等.先说明 ...
- 小米2S电池电量用尽充电无法开机解决方法
背景: 昨晚睡觉前关机,记得电量还有百分之七八十,但早上起床后,指示灯一直红灯闪烁.按开机键和其它键都没反应! ! 解决方法: 扣下电池,用万能充冲电,略微多冲一会,由于 ...