现在的位置: 首页 > 综合 > 正文

自己写的好挫的大数。。。。

2013年12月06日 ⁄ 综合 ⁄ 共 1732字 ⁄ 字号 评论关闭
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define LL long long
#define s2 (sqrt(2))
using namespace std;

struct big_int
{
    int v[1000];
    int len;
    big_int()
    {
        memset(v,0,sizeof(v));
        len=0;
    }
    void mem(int b)
    {
        if(b<0) exit(-1);
        len=0;
        while(b)
        {
            v[len++]=b%10;
            b/=10;
        }
    }
    void mem(const char *s)
    {
        len=0;
        int ls=strlen(s);
        while(ls>0 && s[0]=='0')
        {
            ls--;
            s++;
        }
        while(len<ls)
        {
            v[len]=s[ls-len-1]-'0';
            if(v[len]<0 || v[len]>9) exit(-2);
            len++;
        }
    }
    void print(const char *c="",const char *s="")
    {
        printf("%s",c);
        if(len==0)
        {
            printf("0%s",s);
            return;
        }
        for(int i=len-1;i>=0;i--)
        {
            printf("%d",v[i]);
        }
        printf("%s",s);
    }
};


big_int operator+(big_int a,big_int b)
{
    big_int ans;
    int c=0,la=0,lb=0;
    while(la<a.len && lb<b.len)
    {
        c=a.v[la]+b.v[lb]+c;
        ans.v[ans.len++]=c%10;
        c=c/10;
        la++;lb++;
    }
    while(la<a.len)
    {
        c=a.v[la]+c;
        ans.v[ans.len++]=c%10;
        c=c/10;
        la++;
    }
    while(lb<b.len)
    {
        c=b.v[lb]+c;
        ans.v[ans.len++]=c%10;
        c=c/10;
        lb++;
    }
    while(c)
    {
        ans.v[ans.len++]=c%10;
        c=c/10;
    }
    return ans;
}

big_int exp(int a,int n)
{
    big_int ans;
    ans.len=n+1;
    ans.v[n]=a;
    return ans;
}

big_int exp(big_int a,int n)
{
    big_int ans;
    ans.len=max(0,a.len+n);
    memcpy(ans.v+n,a.v,a.len*sizeof(int));
    return ans;
}

big_int operator*(big_int a,int b)
{
    big_int ans;
    if(a.len==0 || b==0)
    {
        ans.mem(0);
        return ans;
    }
    int c=0,la=0,lb=0;
    while(la<a.len || c>0)
    {
        c=a.v[la]*b+c;
        ans.v[ans.len++]=c%10;
        c=c/10;
        la++;
    }
    return ans;
}

big_int operator*(int a,big_int b)
{
    return b*a;
}

big_int operator*(big_int a,big_int b)
{
    big_int ans;
    if(a.len==0 || b.len==0)
    {
        return ans;
    }
    int len;
    for(len=0;len<b.len;len++)
    {
        ans=ans+exp(a*b.v[len],len);
    }
    return ans;
}

big_int operator^(big_int a,int b)
{
    big_int ans,t=a;
    ans.mem(1);
    while(b)
    {
        if(b&1) ans=ans*t;
        t=t*t;
        b>>=1;
    }
    return ans;
}
big_int operator^(big_int a,big_int b)
{
    big_int ans,t=a;
    ans.mem(1);
    while(b.len)
    {
        ans=ans*(t^b.v[0]);
        t=t^10;
        b=exp(b,-1);
    }
    return ans;
}

int main()
{
    return 0;
}

抱歉!评论已关闭.