大数模板
#include<bits/stdc++.h> #define deb(x) cerr<<#x<<" = "<<(x)<<'\n'; using namespace std; typedef long long ll; //大整数 struct BigInteger { static const int BASE = 100000000;//和WIDTH保持一致 static const int WIDTH = 8;//八位一存储,如修改记得修改输出中的%08d bool sign;//符号, 0表示负数 size_t length; vector<int> num;//反序存 //构造函数 BigInteger (long long x = 0) { *this = x; } BigInteger (const string& x) { *this = x; } BigInteger (const BigInteger& x) { *this = x; } //剪掉前导0 void cutLeadingZero(){ while(num.back() == 0 && num.size() != 1) { num.pop_back(); } } //设置数的长度 void setLength(){ cutLeadingZero(); int tmp = num.back(); if(tmp == 0) { length = 1; } else{ length = (num.size() - 1) * WIDTH; while(tmp > 0) { ++length; tmp /= 10; } } } //赋值运算符 BigInteger& operator = (long long x) { num.clear(); if (x >= 0) sign = true; else { sign = false; x = -x; } do { num.push_back(x%BASE); x/=BASE; } while(x>0); setLength(); return *this; } //赋值运算符 BigInteger& operator = (const string& str) { num.clear(); sign = (str[0] != '-');//设置符号 int x, len=(str.size()-1-(!sign))/WIDTH+1; for(int i=0;i<len;i++) { int End=str.length()-i*WIDTH; int start=max((int)(!sign), End-WIDTH);//防止越界 sscanf(str.substr(start,End-start).c_str(),"%d",&x); num.push_back(x); } setLength(); return *this; } //赋值运算符 BigInteger& operator = (const BigInteger& tmp) { num = tmp.num; sign = tmp.sign; length = tmp.length; return *this; } //将该大数变为一个字符串 string tostring() { string ans = ""; for (int i = 0; i < num.size(); i++) ans.insert(0, to_string(num[i])); if (!sign) ans.insert(0, "-");//负数 return ans; } //数的位数 size_t size() const { return length; } //*10^n 除法中用到 BigInteger e(size_t n) const { int tmp = n % WIDTH; BigInteger ans; ans.length = n + 1; n /= WIDTH; while (ans.num.size() <= n) ans.num.push_back(0); ans.num[n] = 1; while (tmp--) ans.num[n] *= 10; return ans*(*this); } //绝对值 BigInteger abs() const { BigInteger ans(*this); ans.sign = true; return ans; } //正号 const BigInteger& operator + () const { return *this; } // + 运算符 BigInteger operator + (const BigInteger& b) const { if (!b.sign) { return *this - (-b); } if (!sign) { return b - (-*this); } BigInteger ans; ans.num.clear(); for(int i=0,g=0;;i++) { if(g==0&&i>=num.size()&&i>=b.num.size()) break; int x=g; if(i<num.size()) x+=num[i]; if(i<b.num.size()) x+=b.num[i]; ans.num.push_back(x%BASE); g=x/BASE; } ans.setLength(); return ans; } //负号 BigInteger operator - () const { BigInteger ans(*this); if (ans != 0) ans.sign = !ans.sign; return ans; } // - 运算符 BigInteger operator - (const BigInteger& b) const { if (!b.sign) { return *this + (-b); } if (!sign) { return -((-*this) + b); } if (*this < b) { return -(b - *this); } BigInteger ans; ans.num.clear(); for(int i=0,g=0;;i++) { if(g==0&&i>=num.size()&&i>=b.num.size()) break; int x=g; g=0; if(i<num.size()) x+=num[i]; if(i<b.num.size()) x-=b.num[i]; if(x<0){ x+=BASE;g=-1; } ans.num.push_back(x); } ans.setLength(); return ans; } // * 运算符 BigInteger operator * (const BigInteger& b) const { int lena = num.size(), lenb = b.num.size(); vector<long long> ansLL; for (int i = 0; i < lena+lenb; i++) ansLL.push_back(0); for (int i = 0; i < lena; i++){ for (int j = 0; j < lenb; j++){ ansLL[i+j] += (long long)num[i]*(long long)b.num[j]; } } while (ansLL.back() == 0 && ansLL.size() != 1) ansLL.pop_back(); int len = ansLL.size(); long long g = 0, tmp; BigInteger ans; ans.sign = (ansLL.size() == 1 && ansLL[0] == 0) || (sign == b.sign); ans.num.clear(); for (int i = 0; i < len; i++) { tmp = ansLL[i]; ans.num.push_back((tmp + g)%BASE); g = (tmp + g) / BASE; } if (g > 0) ans.num.push_back(g); ans.setLength(); return ans; } // / 运算符 (大数除小数) BigInteger operator / (const long long& b) const { BigInteger c; c.num.clear(); for(int i=0;i<num.size();i++){ c.num.push_back(0); } long long g=0; for(int i=num.size()-1;i>=0;i--) { c.num[i]=(num[i]+g*BASE)/b; g=num[i]+g*BASE-c.num[i]*b; } for(int i=num.size()-1;c.num[i]==0;i--){ c.num.pop_back(); } return c; } // /运算符 (大数除大数) BigInteger operator / (const BigInteger& b) const { BigInteger aa((*this).abs()); BigInteger bb(b.abs()); if (aa < bb) return 0; char *str = new char[aa.size() + 1]; memset(str, 0, sizeof(char)*(aa.size()+1)); BigInteger tmp; int lena = aa.length, lenb = bb.length; for (int i = 0; i <= lena - lenb; i++) { tmp = bb.e(lena - lenb - i); while (aa >= tmp) { ++str[i]; aa = aa - tmp; } str[i] += '0'; } BigInteger ans(str); delete[]str; ans.sign = (ans == 0 || sign == b.sign); return ans; } // % 运算符 (大数取模小数) BigInteger operator % (const long long& b) const { long long ans=0,lena=num.size(); for(int i=lena-1;i>=0;i--){ ans = (ans*BASE+num[i])%b; } return ans; } // %运算符 (大数取模大数) BigInteger operator % (const BigInteger& b) const{ return *this - *this / b * b; } BigInteger& operator ++ () { *this=*this+1;return *this; } // ++ 运算符 BigInteger& operator -- () { *this=*this-1;return *this; } // -- 运算符 BigInteger& operator += (const BigInteger& b) { *this=*this+b;return *this; } // += 运算符 BigInteger& operator -= (const BigInteger& b) { *this=*this-b;return *this; } // -= 运算符 BigInteger& operator *= (const BigInteger& b) { *this=*this*b;return *this; } // *=运算符 BigInteger& operator /= (const long long& b) { *this=*this/b;return *this; } // /=运算符 BigInteger& operator /= (const BigInteger& b) { *this=*this/b;return *this; } // /= 运算符 BigInteger& operator %= (const long long& b) { *this=*this%b;return *this; } // %=运算符 BigInteger& operator %= (const BigInteger& b) { *this=*this%b;return *this; } // %=运算符 // < 运算符 bool operator < (const BigInteger& b) const { if (sign && !b.sign) { return false; }//正负 else if(!sign && b.sign) { return true; }//负正 else if(!sign && !b.sign) { return -b < -*this; }//负负 //正正 if(num.size()!=b.num.size()) return num.size()<b.num.size(); for(int i=num.size()-1;i>=0;i--) if(num[i]!=b.num[i]) return num[i]<b.num[i]; return false; } bool operator > (const BigInteger& b) const { return b<*this; } // > 运算符 bool operator <= (const BigInteger& b) const { return !(b<*this); } // <= 运算符 bool operator >= (const BigInteger& b) const { return !(*this<b); } // >= 运算符 bool operator != (const BigInteger& b) const { return b<*this||*this<b; } // != 运算符 bool operator == (const BigInteger& b) const { return !(b<*this)&&!(*this<b); }//==运算符 bool operator || (const BigInteger& b) const { return *this != 0 || b != 0; } // || 运算符 bool operator && (const BigInteger& b) const { return *this != 0 && b != 0; } // && 运算符 bool operator ! () { return (bool)(*this == 0); } // ! 运算符 //重载<<使得可以直接输出大数 friend ostream& operator << (ostream &out,const BigInteger &x) { if (!x.sign) out<<'-'; out<<x.num.back(); for(int i=x.num.size()-2;i>=0;i--) { char buf[10]; //如WIDTH和BASR有变化,此处要修改为%0(WIDTH)d sprintf(buf,"%08d",x.num[i]); for(int j=0;j<strlen(buf);j++) out<<buf[j]; } return out; } //重载>>使得可以直接输入大数 friend istream& operator >> (istream &in, BigInteger &x) { string str; in >> str; size_t len = str.size(); int i, start = 0; if (str[0] == '-') start = 1; if (str[start] == '\0') return in; for (int i = start; i < len; i++){ if (str[i] < '0' || str[i] > '9') return in; } x.sign = !start; x = str.c_str(); return in; } } ; int main(){ int n; while(cin >> n){ //BigInteger ans = 1; BigInteger ans(1); //最好写成这样 for(int i = 1; i < n+1; i++){ //ans = ans * i; ans = ans * BigInteger(i); } cout << ans << endl; } return 0; }