高精度模板【重载运算符】

代码片
```javascript

```

代码片

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
struct BigInt 
{
    static const int M=1000;
    int num[M +10],len;
    BigInt() 
    {
        clean();
    }
    void clean() 
    {
        memset(num,0,sizeof(num));
        len=1;
    }
    void read() 
    {
        char str[M+10];
        scanf("%s",str);
        len=strlen(str);
        FOR(i,1,len)
        num[i]=str[len-i]-'0';
    }
    void write() 
    {
        _FOR(i,len,1)
        printf("%d",num[i]);
        //puts("");
    }
    void itoBig(int x) 
    {
        clean();
        while(x != 0) 
        {
            num[len++]=x%10;
            x/=10;
        }
        if(len!=1) 
            len--;
    }
    bool operator < (const BigInt &cmp) const
    {
        if(len!=cmp.len) 
            return len<cmp.len;
        _FOR(i,len,1)
        if(num[i]!=cmp.num[i]) 
            return num[i]<cmp.num[i];
        return false;
    }
    bool operator > (const BigInt &cmp) const
    { 
        return cmp <*this; 
    }
    bool operator <= (const BigInt &cmp) const
    { 
        return !(cmp<*this); 
    }
    bool operator != (const BigInt &cmp) const
    { 
        return cmp<*this||*this<cmp; 
    }
    bool operator == (const BigInt &cmp) const
    { 
        return !(cmp<*this||*this<cmp); 
    }
    BigInt operator + (const BigInt &A) const
    {
        BigInt S;
        S.len=max(len,A.len);
        FOR(i,1,S.len) 
        {
            S.num[i]+=num[i]+A.num[i];
            if(S.num[i]>=10) 
            {
                S.num[i]-=10;
                S.num[i+1]++;
            }
        }
        while(S.num[S.len+1]) 
            S.len++;
        return S;
    }
    BigInt operator - (const BigInt &A) const
    {
        BigInt S;
        S.len=max(len,A.len);
               
        FOR(i,1,S.len) 
        {
            S.num[i]+=num[i]-A.num[i];
            if(S.num[i]<0) 
            {
                S.num[i]+=10;
                S.num[i+1]--;
            }
        }
        while(!S.num[S.len]&&S.len>1) 
            S.len--;
        return S;
    }
    BigInt operator * (const BigInt &A) const
    {
        BigInt S;
        if((A.len==1&&A.num[1]==0)||(len==1&&num[1]==0)) 
            return S;
        S.len=A.len+len-1;
        FOR(i,1,len)
        FOR(j,1,A.len) 
        {
            S.num[i+j-1]+=num[i]*A.num[j];
            S.num[i+j]+=S.num[i+j-1]/10;
            S.num[i+j-1]%=10;
        }
        while(S.num[S.len+1]) 
            S.len++;
        return S;
    }
    BigInt operator / (const BigInt &A) const
    {
        BigInt S;
        if((A.len==1&&A.num[1]==0)||(len==1&&num[1]==0)) 
            return S;
        BigInt R,N;
        S.len=0;
        _FOR(i,len,1) 
        {
            N.itoBig(10);
            R=R*N;
            N.itoBig(num[i]);
            R=R+N;
            int flag=-1;
            FOR(j,1,10) 
            {
                N.itoBig(j);
                if(N*A>R) 
                {
                    flag=j-1;
                    break;
                }
            }
            S.num[++S.len]=flag;
            N.itoBig(flag);
            R=R-N*A;
        }
        FOR(i,1,S.len/2) 
            swap(S.num[i],S.num[len-i+1]);
        while(!S.num[S.len]&&S.len>1) 
            S.len--;
        return S;
    }
    BigInt operator % (const BigInt &A) const
    {
        BigInt S;
        BigInt P=*this/A;
        S=*this - P * A;
        return S;
    }
};
int main() 
{
    BigInt a,b;
    a.read();b.read();
    (a+b).write();
    

	
/*	--------------------------------------------------------
	    特别注意(减法符号运算判断符号)多亏大佬的悉心指点 
	
	if(a<b)
	{
		printf("-")
		(b-a).write();
		
	 } else (a-b).write();
	--------------------------------------------------------
*/




    return 0;
}

麦森数

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
int n,f[1001],res[1001],sav[1001];
void w1()
{
	memset(sav,0,sizeof sav);
	for(int i=1;i<=500;i++)
	for(int j=1;j<=500;j++)
	{
		sav[i+j-1]+=res[i]*f[j];
	}
	for(int i=1;i<=500;i++)
	{
		sav[1+i]+=sav[i]/10;
		sav[i]%=10;
	}memcpy(res,sav,sizeof res);
}
void w2()
{
	memset(sav,0,sizeof sav);
	for(int i=1;i<=500;i++)
	for(int j=1;j<=500;j++)
	{
		sav[i+j-1]+=f[i]*f[j];
	}
	for(int i=1;i<=500;i++)
	{
		sav[1+i]+=sav[i]/10;
		sav[i]%=10;
	}memcpy(f,sav,sizeof f);
}


int p;
int main()
{
	scanf("%d",&p);
	printf("%d\n",(int)(log10(2)*p+1));
	
	f[1]=2,res[1]=1;
	while(p!=0)
	{
		if(p%2==1)w1();
		p/=2;
		w2();
	}res[1]--;
	for(int i=500;i>=1;i--)
	{
		if(i!=500&&i%50==0)printf("\n%d",res[i]);
	else	printf("%d",res[i]);
	}
}
#include<cstdio>
#include<algorithm>
#define maxn 1000
#define len 10000
using namespace std;
  
struct tnode{int a,b,c;}q[maxn+20];
int ans[maxn+20],p[maxn+20],g[maxn+20];
  
bool cmp(tnode x,tnode y)
{
  return x.c<y.c;
}
  
void div(int x)
{
  int i,j,k,last=0;
  if(p[p[0]]>=x)g[0]=p[0];
  else g[0]=p[0]-1;
   
  for(i=p[0];i>=1;i--)
    {
      g[i]=p[i]+last*len;
      last=g[i]%x,g[i]/=x;
    }
}
  
void MAX()
{
  int i,j,k;
  if(ans[0]>g[0])return;
  if(ans[0]==g[0])
    {
      for(i=ans[0];i>=1;i--)
        {
          if(ans[i]>g[i])return;
          if(ans[i]<g[i])break;
        }
      if(i==0)return;
    }
  for(i=0;i<=g[0];i++)ans[i]=g[i];
}
  
void multi(int x)
{
  int i,j,k,last=0;
  for(i=1;i<=p[0];i++)
    {
      p[i]=p[i]*x+last;
      last=p[i]/len,p[i]%=len;
    }
  if(last>0)p[++p[0]]=last;
}
  
int main()
{
  int i,j,k,n;
  scanf("%d%d%d",&n,&p[1],&k);
  p[0]=1;
   
  for(i=1;i<=n;i++)
    {
      scanf("%d%d",&q[i].a,&q[i].b);
      q[i].c=q[i].a*q[i].b;
    }
  sort(q+1,q+n+1,cmp);
   
  for(i=1;i<=n;i++)
    {
      div(q[i].b);
      MAX();
      multi(q[i].a);
    }
  printf("%d",ans[ans[0]]);
  for(i=ans[0]-1;i>=1;i--)printf("%04d",ans[i]);
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值