首页 > 编程语言 >c++高精度模板

c++高精度模板

时间:2023-09-12 12:37:30浏览次数:35  
标签:const 高精度 int len bign c++ operator return 模板



#include <iostream>  
#include <stdio.h>  
#include <string.h>  
#include <math.h>  
#include <algorithm>  
#include <string>  
#include <vector>  
#include <list>  
using namespace std;  
  
const int maxn = 1000;  
  
struct bign  
{  
       int len, s[maxn];  //s是逆序存储  
       bign(){ memset(s, 0 , sizeof(s)); len = 1 ; } //构造函数  
       bign(int num) { *this  = num ; } //初始化  
       bign(const char* num) { *this = num ; }  
       string str() const  
       {  
           int i;  
           string res = "";  
           for( i = 0 ; i < len ; i++ )   
               res = (char)( s[i] + '0' ) + res ;  
           if (res == "") res = "0";  
           return res;  
       }   
          
       bign operator = (const char* num)  
       {  
            int i;  
            len = strlen(num);  
            for( i = 0 ; i < len ; i++ )  
                s[i] = num[len-i-1] - '0' ;  
            return *this;   
       }   
         
       bign operator = (int num)  
       {  
            char s[maxn];  
            sprintf(s , "%d" , num);  
            *this = s;  
            return *this;  
       }   
       //辅助函数 
	   void clean() { while(len > 1 && !s[len-1]) len--; }
       bign operator + (const bign& b) const  
       {  
            bign c;  
            c.len = 0;  
            int i, g;  
            for( i = 0 , g = 0 ; g || i < ( len > b.len ? len : b.len ) ; i++ )  
            {  
                 int x = g ;  
                 if( i < len ) x += s[i] ;  
                 if( i < b.len ) x += b.s[i] ;  
                 c.s[c.len++] = x % 10 ;  
                 g = x / 10 ;  
            }  
			c.clean();
            return c;  
       }  
	   bign operator+= (const bign &b)
		{
			 *this = *this + b;
			 return *this;
		}

       //比较的前提是两个数都没有前导零   
       bool operator < (const bign& b) const  
       {  
            if( len != b.len ) return len < b.len ;  
            int i;  
            for( i = len-1 ; i >= 0 ; i-- )  
                if( s[i] != b.s[i] ) return s[i] < b.s[i];  
            return false;  
       }  
       bool operator > (const bign& b) const { return b < *this; }  
       bool operator <= (const bign& b) const { return !(b < *this); }   
       bool operator >= (const bign& b) const { return !(*this < b); }   
       bool operator != (const bign& b) const { return b < *this || *this < b; }   
       bool operator == (const bign& b) const { return !(b < *this) || !(*this < b); }    
};  
  
istream& operator >> (istream &in , bign& x)  
{  
         string s;  
         in >> s;  
         x = s.c_str();  
         return in;  
}  
ostream& operator << (ostream &out , const bign& x)  
{  
         out << x.str();  
         return out;  
}




标签:const,高精度,int,len,bign,c++,operator,return,模板
From: https://blog.51cto.com/u_16244339/7444302

相关文章

  • 最长上升子序列----nlogn算法-模板
    #include<iostream>#include<vector>#defineMAX1010usingnamespacestd;vector<int>len;//这里我返回的满足len[k]>=val[i]且k最小的位置//和上文红色部分的描述是等价的,只是变成了更新len[k],而不是len[k+1]intbisearch(intval){intleft=0,right=len.size(......
  • 高精度加减法模板
    正整数+-法#include<stdio.h>#include<string.h>voidplus(char*a,char*b,char*c);voidminus(char*a,char*b,char*c);voidminus(char*a,char*b,char*c){ inti,j,k; intla=strlen(a); intlb=strlen(b); intflag=0; memset(c,0......
  • a^b%c问题 ---模板
    (1)ABmodC.(1<=A,B<2^62,1<=C<=10^9)http://acm.bit.edu.cn/mod/programming/view.php?a=530快速幂----二分#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>usingnamespacestd;longlongquickpow(......
  • 树状数组--模板
    #include<stdio.h>#include<string.h>#defineN50050intn;intin[N];intLowbit(intt){ returnt&(-t);}intSum(intp){ intsum=0; while(p>0) { sum+=in[p]; p-=Lowbit(p); } returnsum;}voidplus(intp,intnum){ while(......
  • dijkstra 模板
    Input输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time分钟;(1=<(a,b)<=1000;a,b之间可能有多条路)接着的第T+1行有S个数,表示和草儿家相连的城市;接着的第T+2行......
  • 古罗马--模板
    计算古罗马加法,输入不合法,则输出“Aha!Idon'tneedtocalculatethesum”。 测试用例1以文本方式显示I↵I↵以文本方式显示II↵1秒64M0#include<stdio.h>#include<string.h>#include<stdlib.h>charp[5][11][10];voiddabiao(){ memset(p,0,sizeof(p)); st......
  • 最长上升子序列 ---模板
    #include<stdio.h>#include<string.h>intn;intp[100000];intdp[100000];intmain(){ inti,j,k; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d",&p[i]); memset(dp,0,sizeof(dp)); dp[1]=1; ......
  • spfa---模板
    spfa模板#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>usingnamespacestd;#defineV1010//点的个数#defineE4020//变的个数*2(双向边)#defineINF0x3f3f3f3fstructnode{ inta,b,len;}p[E];intnex[E];intfirs......
  • 矩阵快速幂--模板
    http://acm.bit.edu.cn/mod/programming/view.php?id=670TheLittleArchitectII#include<stdio.h>#include<string.h>//dp方程:f[n]=3*f[n-1]+3*f[n-2]-f[n-3];//矩阵快速幂。。模板//构造矩阵//310//301//-100structnode{ longlonga[3][3];};lon......
  • 最小生成树---模板
    最基础模板#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;#defineV110//点的个数#defineE5100//边的个数intparent[V];introot(intp){ if(parent[p]==-1)returnp; elsereturnparent[p]=root(parent[p]);}void......