1. 程式人生 > >高精度模板(從洛谷題解中騙來的

高精度模板(從洛谷題解中騙來的

fine truct one sizeof pri PE sin sync main

乘法通用模板:

技術分享圖片
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <list>
#include <iterator>
#include <cmath>
using
namespace std; #define lson (l , mid , rt << 1) #define rson (mid + 1 , r , rt << 1 | 1) #define debug(x) cerr << #x << " = " << x << "\n"; #define pb push_back #define pq priority_queue #define Pll pair<ll,ll> #define Pii pair<int,int> #define
fi first #define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define FT(A,B,C) for(int A=B;A <= C;A++) //用來壓行 typedef long long ll; typedef unsigned long long ull; /*-----------------show time----------------*/ using namespace std; const int N=1005; struct
int_l{ int data[N]; int_l(){//結構體的初始化 這很關鍵 memset(data,0,sizeof(data)); data[0]=1; } int_l(int x){//將低精數轉化為高精數 memset(data,0,sizeof(data)); data[0]=1; int i=1; while(x){ data[i++]=x%10; x/=10; } data[0]=--i; } int_l operator *(const int &x){//重載乘號 * 註意只能高精*低精 不能 低精*高精 int_l a; int len; a.data[0]=data[0]; FT(i,1,data[0]) a.data[i]=data[i]*x; for(int i=1;i<=a.data[0] || a.data[i];len=++i){ a.data[i+1]+=a.data[i]/10; a.data[i]%=10;} a.data[len]? a.data[0]=len : a.data[0]=--len; return a; } int_l operator +(const int_l &x){//重載加號 + int_l a; a.data[0]=max(data[0],x.data[0]); FT(i,1,a.data[0]) a.data[i]=data[i]+x.data[i]; FT(i,1,a.data[0]){ a.data[i+1]+=a.data[i]/10; a.data[i]%=10;} a.data[a.data[0]+1]? a.data[0]++ : a.data[0]; return a; } }; ostream& operator << (ostream& out, const int_l &x){//這行比較高深 重載輸出流 //嫌麻煩的 可以用普通的方法輸出也行 FT(i,1,x.data[0]) out<<x.data[x.data[0]-i+1]; return out; } int main(){ int n; OKC; cin>>n; int_l ans(0),a(1); for(int i=1; i<=n; i++) { a = a*i; ans =ans + a; } cout<<ans<<endl; return 0; }
高精度乘法

高精度模板(從洛谷題解中騙來的