当前位置: 首页 > news >正文

HDU1042 N!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042

#include < iostream >
#include
< stdio.h >
#include
< string >
#include
< iomanip >
#include
< algorithm >
using   namespace  std;

const   int  MAX_GROUPS  =   10000 ; // 最多万组,每组最多位整数,即最多可容纳万位整数
const   int  MAXN  =   9999 ; // 每组的上限值
const   int  GROUP_LEN  =   4 ; // 每组的最大长度

class  BigInteger
{
private :
    
int  data[MAX_GROUPS];
    
int  len;
    
void  init()
    {
        memset(data,
0 , sizeof (data));
    }
public :
    BigInteger()
    {
        init();
        len 
=   0 ;
    }
    BigInteger(
const   int  b);
    BigInteger(
const  BigInteger  & );

    
bool   operator   >  ( const  BigInteger & ) const ;
    BigInteger 
&   operator = ( const  BigInteger  & );
    BigInteger 
&  add( const  BigInteger  & );
    BigInteger 
&  sub( const  BigInteger  & );
    BigInteger 
operator + ( const  BigInteger  & const ;
    BigInteger 
operator - ( const  BigInteger  & const ;
    BigInteger 
operator * ( const  BigInteger  & const ;
    BigInteger 
operator / ( const   int   & const ;
    
void  print();
};
BigInteger::BigInteger(
const   int  num)
{
    
int  res,tmp  =  num;
    len 
=   0 ;
    init();
    
while (tmp  >  MAXN)
    {
        res 
=  tmp  -  tmp  /  (MAXN  +   1 *  (MAXN  +   1 );
        tmp 
=  tmp  /  (MAXN  +   1 );
        data[len
++ =  res;
    }
    data[len
++ =  tmp;
}
BigInteger::BigInteger(
const  BigInteger  &  rhs) : len(rhs.len)
{
    
int  i;
    init();
    
for (i  =   0  ; i  <  len ; i ++ )
    {
        data[i] 
=  rhs.data[i];
    }
}
bool  BigInteger:: operator   >  ( const  BigInteger  & rhs) const
{
    
int  ln;
    
if (len  >  rhs.len)
    {
        
return   true ;
    }
    
else   if (len  <  rhs.len)
    {
        
return   false ;
    }
    
else   if (len  ==  rhs.len)
    {
        ln 
=  len  -   1 ;
        
while (data[ln]  ==  rhs.data[ln]  &&  ln  >=   0
        {
            ln
-- ;
        }
        
if (ln  >=   0   &&  data[ln]  >  rhs.data[ln]) 
        {
            
return   true ;
        }
        
else  
        {
            
return   false ;
        }
    }

}

BigInteger 
&  BigInteger:: operator   =  ( const  BigInteger  & rhs)
{
    init();
    len 
=  rhs.len;
    
for ( int  i  =   0  ; i  <  len ; i ++ )
    {
        data[i] 
=  rhs.data[i];
    }
    
return   * this ;
}
BigInteger
&  BigInteger::add( const  BigInteger  & rhs)
{
    
int  i,nLen;

    nLen 
=  rhs.len  >  len  ?  rhs.len : len;
    
for (i  =   0  ; i  <  nLen ; i ++ )
    {
        data[i] 
=  data[i]  +  rhs.data[i];
        
if (data[i]  >  MAXN)
        {
            data[i 
+   1 ] ++ ;
            data[i] 
=  data[i]  -  MAXN  -   1 ;
        }
    }
    
if (data[nLen]  !=   0
    {
        len 
=  nLen  +   1 ;
    }
    
else  
    {
        len 
=  nLen;
    }

    
return   * this ;
}
BigInteger 
&  BigInteger::sub( const  BigInteger  & rhs)
{
    
int  i,j,nLen;
    
if  (len  >  rhs.len)
    {
        
for (i  =   0  ; i  <  nLen ; i ++ )
        {
            
if (data[i]  <  rhs.data[i])
            {
                j 
=  i  +   1 ;
                
while (data[j]  ==   0 ) j ++ ;
                data[j]
-- ;
                
-- j;
                
while (j  >  i)
                {
                    data[j] 
+=  MAXN;
                    
-- j;
                }
                data[i] 
=  data[i]  +  MAXN  +   1   -  rhs.data[i];
            }
            
else  
            {
                data[i] 
-=  rhs.data[i];
            }
        }
        len 
=  nLen;
        
while (data[len  -   1 ==   0   &&  len  >   1
        {
            
-- len;    
        }
    }
    
else   if  (len  ==  rhs.len)
    {
        
for (i  =   0  ; i  <  len ; i ++ )
        {
            data[i] 
-=  rhs.data[i];
        }
        
while (data[len  -   1 ==   0   &&  len  >   1
        {
            
-- len;    
        }
    }
    
return   * this ;
}
BigInteger BigInteger::
operator + ( const  BigInteger  &  n)  const  
{
    BigInteger a 
=   * this ;
    a.add(n);
    
return  a;
}
BigInteger BigInteger::
operator - ( const  BigInteger  &  T)  const
{
    BigInteger b 
=   * this ;
    b.sub(T);
    
return  b;
}
BigInteger BigInteger::
operator   *  ( const  BigInteger  & rhs)  const
{
    BigInteger result;
    
int  i,j,up;
    
int  temp,temp1;

    
for (i  =   0 ; i  <  len; i ++ )
    {
        up 
=   0 ;
        
for (j  =   0 ; j  <  rhs.len; j ++ )
        {
            temp 
=  data[i]  *  rhs.data[j]  +  result.data[i  +  j]  +  up;
            
if (temp  >  MAXN)
            {
                temp1 
=  temp  -  temp  /  (MAXN  +   1 *  (MAXN  +   1 );
                up 
=  temp  /  (MAXN  +   1 );
                result.data[i 
+  j]  =  temp1;
            }
            
else  
            {
                up 
=   0 ;
                result.data[i 
+  j]  =  temp;
            }
        }
        
if (up  !=   0 )
        {
            result.data[i 
+  j]  =  up;
        }
    }
    result.len 
=  i  +  j;
    
while (result.data[result.len  -   1 ==   0   &&  result.len  >   1 ) result.len -- ;
    
return  result;
}
BigInteger BigInteger::
operator / ( const   int   &  b)  const
{
    BigInteger ret;
    
int  i,down  =   0 ;

    
for (i  =  len  -   1  ; i  >=   0  ; i -- )
    {
        ret.data[i] 
=  (data[i]  +  down  *  (MAXN  +   1 ))  /  b;
        down 
=  data[i]  +  down  *  (MAXN  +   1 -  ret.data[i]  *  b;
    }
    ret.len 
=  len;
    
while (ret.data[ret.len  -   1 ==   0 ) ret.len -- ;
    
return  ret;
}
void  BigInteger::print()
{
    
int  i;

    cout 
<<  data[len  -   1 ];
    
for (i  =  len  -   2  ; i  >=   0  ; i -- )
    {
        cout.width(GROUP_LEN);
        cout.fill(
' 0 ' );
        cout 
<<  data[i];
    }
    cout 
<<  endl;
}
int  main()
{
    
int  i,n;
    BigInteger result,num;

    
while (scanf( " %d " , & n) != EOF)
    {
        result 
=  BigInteger( 1 );
        
for (i  =   2 ;i  <=  n;  ++ i)
        {
            num 
=  BigInteger(i);
            result 
=  result  *  num;
        }
        result.print();
    }
    
return   0 ;
}

相关文章:

  • [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
  • Web Service基本概念
  • 网关(Gateway)--帮你深入理解什么是网关
  • 04. 字符串合并与拆分写法小结
  • Linux下的I/O
  • URLlib2 模拟浏览器header
  • 【原创】用SQL语句删除重复记录的方法总结
  • 软件定义的4-7层服务
  • 实现一个JavaScript验证的Asp.net Helper
  • HTML重构与网页常用工具
  • 国学应用大师翟鸿燊经典语录
  • shell---scp远程传输文件不需要手动输入密码
  • STP生成树协议
  • WDatePicker
  • OSPF笔记-2
  • JS 中的深拷贝与浅拷贝
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CSS 三角实现
  • CSS相对定位
  • git 常用命令
  • gops —— Go 程序诊断分析工具
  • js对象的深浅拷贝
  • mongodb--安装和初步使用教程
  • Redis在Web项目中的应用与实践
  • SpingCloudBus整合RabbitMQ
  • Vue ES6 Jade Scss Webpack Gulp
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • webgl (原生)基础入门指南【一】
  • 不上全站https的网站你们就等着被恶心死吧
  • 服务器之间,相同帐号,实现免密钥登录
  • 京东美团研发面经
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 深度学习中的信息论知识详解
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序开发问题汇总
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 仓管云——企业云erp功能有哪些?
  • 积累各种好的链接
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 计算机视觉入门
  • #162 (Div. 2)
  • #git 撤消对文件的更改
  • (20050108)又读《平凡的世界》
  • (5)STL算法之复制
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (十六)Flask之蓝图
  • (十六)串口UART
  • (推荐)叮当——中文语音对话机器人
  • (学习日记)2024.01.09
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)认识微服务
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转载)深入super,看Python如何解决钻石继承难题
  • *ST京蓝入股力合节能 着力绿色智慧城市服务