hdu 1042 N!(大数)

题意:整数大数乘法

思路:大数模板

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

#define MAXN 9999//万进制
#define DLEN 4//4位

class BigNum{
private:
    int a[50000];//可以控制大数位数(500*4)
    int len;//大数长度
public:
    BigNum(){//构造函数
        len=1;
        memset(a,0,sizeof(a));
    }
    BigNum(const int);//将int转化为大数
    BigNum(const char*);//将字符串转化为大数
    BigNum(const BigNum &);//拷贝构造函数
    BigNum &operator=(const BigNum &);//重载复制运算符,大数之间赋值

    BigNum operator+(const BigNum &)const;//大数+大数
    BigNum operator-(const BigNum &)const;//大数-大数
    BigNum operator*(const BigNum &)const;//大数*大数
    BigNum operator/(const int &)const;//大数/int

    BigNum operator^(const int &)const;//幂运算
    int operator%(const int &)const;//取模
    bool operator>(const BigNum &)const;//大数与大数比较
    bool operator>(const int &)const;//大数与int比较

    void print();//输出大数
};

BigNum::BigNum(const int b){//将int转化为大数
    int c,d=b;
    len=0;
    memset(a,0,sizeof(a));
    while(d>MAXN){
        //c=d-(d/(MAXN+1))*(MAXN+1);
        c=d%(MAXN+1);//取出后四位
        d=d/(MAXN+1);//
        a[len++]=c;
    }
    a[len++]=d;
}

BigNum::BigNum(const char *s){//将字符串转化为大数
    int t,k,index,l,i,j;
    memset(a,0,sizeof(a));
    l=strlen(s);
    len=l/DLEN;
    if(l%DLEN)++len;
    index=0;
    for(i=l-1;i>=0;i-=DLEN){
        t=0;
        k=i-DLEN+1;
        if(k<0)k=0;
        for(j=k;j<=i;++j)
            t=t*10+s[j]-‘0‘;
        a[index++]=t;
    }
}

BigNum::BigNum(const BigNum &T):len(T.len){//拷贝构造函数
    int i;
    memset(a,0,sizeof(a));
    for(i=0;i<len;++i)
        a[i]=T.a[i];
}

BigNum &BigNum::operator=(const BigNum &n){//重载复制运算符,大数之间赋值
    int i;
    len=n.len;
    memset(a,0,sizeof(a));
    for(i=0;i<len;++i)
        a[i]=n.a[i];
    return *this;
}

BigNum BigNum::operator+(const BigNum &T)const{//大数+大数
    BigNum t(*this);
    int i,big;//位数
    big=T.len>len?T.len:len;
    for(i=0;i<big;++i){
        t.a[i]+=T.a[i];
        if(t.a[i]>MAXN){
            ++t.a[i+1];
            t.a[i]-=MAXN+1;
        }
    }
    if(t.a[big]!=0)t.len=big+1;
    else t.len=big;
    return t;
}

BigNum BigNum::operator-(const BigNum &T)const{//大数-大数
    int i,j,big;
    bool flag;
    BigNum t1,t2;//t1大的,t2小的
    if(*this>T){
        t1=*this;
        t2=T;
        flag=0;//前面的大
    }
    else{
        t1=T;
        t2=*this;
        flag=1;//前面的小
    }
    big=t1.len;
    for(i=0;i<big;++i){
        if(t1.a[i]<t2.a[i]){
            j=i+1;
            while(t1.a[j]==0)++j;
            --t1.a[j--];
            while(j>i)t1.a[j--]+=MAXN;
            t1.a[i]+=MAXN+1-t2.a[i];
        }
        else t1.a[i]-=t2.a[i];
    }
    while(t1.a[t1.len-1]==0&&t1.len>1){
        --t1.len;
        --big;
    }
    if(flag)t1.a[big-1]=-t1.a[big-1];//前面的小,结果为负
    return t1;
}

BigNum BigNum::operator*(const BigNum &T)const{//大数*大数
    BigNum ret;
    int i,j,up;
    int temp,temp1;
    for(i=0;i<len;++i){
        up=0;
        for(j=0;j<T.len;++j){
            temp=a[i]*T.a[j]+ret.a[i+j]+up;
            if(temp>MAXN){
                //temp1=temp-temp/(MAXN+1)*(MAXN+1);
                temp1=temp%(MAXN+1);
                up=temp/(MAXN+1);
                ret.a[i+j]=temp1;
            }
            else{
                up=0;
                ret.a[i+j]=temp;
            }
        }
        if(up!=0)ret.a[i+j]=up;
    }
    ret.len=i+j;
    while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
    return ret;
}

BigNum BigNum::operator/(const int &b)const{//大数/int
    BigNum ret;
    int i,down=0;
    for(i=len-1;i>=0;--i){
        ret.a[i]=(a[i]+down*(MAXN+1))/b;
        down=a[i]+down*(MAXN+1)-ret.a[i]*b;
    }
    ret.len=len;
    while(ret.a[ret.len-1]==0&&ret.len>1)--ret.len;
    return ret;
}

BigNum BigNum::operator^(const int &n)const{//幂运算
    BigNum t,ret(1);
    int i;
    if(n<0)exit(-1);
    if(n==0)return 1;
    if(n==1)return *this;
    int m=n;
    while(m>1){
        t=*this;
        for(i=1;i<<1<=m;i<<=1){
            t=t*t;
        }
        m-=i;
        ret=ret*t;
        if(m==1)ret=ret*(*this);
    }
    return ret;
}

int BigNum::operator%(const int &b)const{//取模
    int i,d=0;
    for(i=len-1;i>=0;--i){
        d=((d*(MAXN+1))%b+a[i])%b;
    }
    return d;
}

bool BigNum::operator>(const BigNum &T)const{//大数与大数比较
    int ln;
    if(len>T.len)return true;
    else if(len==T.len){
        ln=len-1;
        while(a[ln]==T.a[ln]&&ln>=0)--ln;
        if(ln>=0&&a[ln]>T.a[ln])return true;
        else return false;
    }
    else return false;
}

bool BigNum::operator>(const int &t)const{//大数与int比较
    BigNum b(t);
    return *this>b;
}

void BigNum::print(){//输出大数
    int i;
    printf("%d",a[len-1]);
    for(i=len-2;i>=0;--i){
        printf("%.4d",a[i]);//%.4d代表4位,不够前面补0
    }
    printf("\n");
}

int main(){
    int n,i;
    BigNum a;
    while(~scanf("%d",&n)){
        if(n==0||n==1)printf("1\n");
        else{
            a=BigNum(1);
            for(i=2;i<=n;++i)
                a=a*BigNum(i);
            a.print();
        }
    }
    return 0;
}

时间: 2024-10-24 10:08:34

hdu 1042 N!(大数)的相关文章

hdu 1042 N!(大数阶乘,转化为100000这样的比较大的进制)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54172    Accepted Submission(s): 15365 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one

HDU 1042 N! (大数阶乘,还是Java大法好,C也不能错过!!!)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 73270    Accepted Submission(s): 21210 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in o

HDU 1042 N!(大数阶乘)

N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Output For each N, output N! in one line. Sample Input 1 2 3 Sample Output 1 2 6 代码: 1 #include<cstdio> 2 usi

HDU 1042 大数阶乘

B - 2 Time Limit:5000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1042 Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Outpu

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

HDU 1042 N! 参考代码

请问DIY题目做不来的队员:听进去了吗?去消化吸收了吗?能百度一下吗? 请问集训队员:有兴趣吗?有团队合作精神吗?有责任感吗?能坚持吗?能自主学习吗?能承受挫败吗? HDU 1042 N! 题意:Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! (题目链接) #include <iostream> using namespace std; //每个数组元素存放5位数 const int MAX=1000000; //

hdu 4927 Java大数

http://acm.hdu.edu.cn/showproblem.php?pid=4927 [解法]:最后的结果是C(n-1,0)*a[n] -C(n-1, 1) * a[n-1] ……C(n-1,n-1)*a[1].符号位一正一负交替. 因为n有3000 之大,算C(n,i) 时要用到大数. 诶  其实早就把公式推出来了,就是坑在Java语言不熟悉,在编译的时候总是出现这个 我们一直以为是语法错误,但是又发现有什么地方写错了,卡了几个小时,人都要抓狂了. 今天拿着后面过的代码跟第一个交的比较

(hdu)1042 N! 大数相乘

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1042 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Output For each N, output N! in one line. Sample Input

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 stati

hdu 1042 N!(大数的阶乘)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 55659    Accepted Submission(s): 15822 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one