zoukankan      html  css  js  c++  java
  • HDU 1042 大数计算

    这道题一开始就采用将一万个解的表打好的话,虽然时间效率比较高,但是内存占用太大,就MLE

    这里写好大数后,每次输入一个n,然后再老老实实一个个求阶层就好

    java代码:

     1 /**
     2  * @(#)Main.java
     3  *
     4  *
     5  * @author 
     6  * @version 1.00 2014/12/21
     7  */
     8 import java.util.*;
     9 import java.math.*;
    10 
    11 public class Main {
    12     //public static BigInteger a [] = new BigInteger[10001];
    13     public static void main(String [] args){
    14         Scanner input = new Scanner(System.in);
    15         int n;
    16         while(input.hasNext()){
    17             n = input.nextInt();
    18             BigInteger a [] = new BigInteger[2];
    19             a[0] = new BigInteger("1");
    20             for(int i = 1; i<=n ; i++){
    21                 String s = Integer.toString(i);
    22                 a[i&1] = new BigInteger(s);
    23             //        a[i].valueOf(i);
    24                 a[i&1] = a[i&1].multiply(a[1-(i&1)]);
    25             }
    26         
    27             System.out.println(a[n&1]);
    28         }
    29     }
    30     
    31     
    32 }

    c++代码:

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 using namespace std ;
      5 
      6 typedef long long LL ;
      7 
      8 #define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )
      9 #define For( i , a , b ) for ( int i = a ; i <= b ; ++ i )
     10 #define rev( i , a , b ) for ( int i = a ; i >= b ; -- i )
     11 
     12 const int M = 10000 ;
     13 
     14 struct BigInt {
     15     int digit[10000] ;
     16     int length ;
     17 
     18     BigInt () {
     19         length = 0 ;
     20         memset ( digit , 0 , sizeof digit ) ;
     21     }
     22 
     23     BigInt ( LL number ) {
     24         length = 0 ;
     25         memset ( digit , 0 , sizeof digit ) ;
     26         while ( number ) {
     27             digit[length ++] = number % M ;
     28             number /= M ;
     29         }
     30     }
     31 
     32     int operator [] ( const int index ) const {
     33         return digit[index] ;
     34     }
     35 
     36     int& operator [] ( const int index ) {
     37         return digit[index] ;
     38     }
     39 
     40     BigInt fix () {
     41         while ( length && digit[length - 1] == 0 ) -- length ;
     42         return *this ;
     43     }
     44 
     45     BigInt operator + ( const BigInt& a ) const {
     46         BigInt c ;
     47         c.length = max ( length , a.length ) + 1 ;
     48         int add = 0 ;
     49         rep ( i , 0 , c.length ) {
     50             add += a[i] + digit[i] ;
     51             c[i] = add % M ;
     52             add /= M ;
     53         }
     54         return c.fix () ;
     55     }
     56 
     57     BigInt operator - ( const BigInt& a ) const {
     58         BigInt c ;
     59         c.length = max ( a.length , length ) ;
     60         int del = 0 ;
     61         rep ( i , 0 , c.length ) {
     62             del += digit[i] - a[i] ;
     63             c[i] = del ;
     64             del = 0 ;
     65             if ( c[i] < 0 ) {
     66                 int tmp = ( c[i] - 1 ) / M + 1 ;
     67                 c[i] += tmp * M ;
     68                 del -= tmp ;
     69             }
     70         }
     71         return c.fix () ;
     72     }
     73 
     74     BigInt operator * ( const BigInt& a ) const {
     75         BigInt c ;
     76         c.length = a.length + length ;
     77         rep ( i , 0 , length ) {
     78             int mul = 0 ;
     79             For ( j , 0 , a.length ) {
     80                 mul += digit[i] * a[j] + c[i + j] ;
     81                 c[i + j] = mul % M ;
     82                 mul /= M ;
     83             }
     84         }
     85         return c.fix () ;
     86     }
     87 
     88     void show () {
     89         printf ( "%d" , digit[length - 1] ) ;
     90         rev ( i , length - 2 , 0 ) printf ( "%04d" , digit[i] ) ;
     91         printf ( "
    " ) ;
     92     }
     93 
     94 } ;
     95 
     96 
     97 int main ()
     98 {
     99     int n;
    100     while (~scanf("%d" , &n)) {
    101         BigInt big[2];
    102         big[0] = BigInt(1);
    103         for(int i = 1 ; i<=n ; i++)
    104             big[i&1] = big[1-(i&1)] * BigInt(i);
    105         big[n&1].show();
    106     }
    107     return 0 ;
    108 }
  • 相关阅读:
    中国软件外包IT公司最新排名
    DJ舞曲、音乐与爱好!
    linux论坛
    IBM P 系列小型机的控件面板功能~!(转用)
    JDBC Driver 驱动 For SQL 2008 Server /2005 /2000
    年报盘点:149家公司筹码大幅集中
    公式指标—精华
    观峰雨个人空间 2010 STOCK ADVICE !
    IntelliJ IDEA提示Cannot resolve symbol
    今天天变的好冷了~
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4177325.html
Copyright © 2011-2022 走看看