高精度(+ - * / %)——模版

大数模板 0

  1. 这个板子只能 +
#include <bits/stdc++.h>
using namespace std;
#define db  double
#define ll  long long
#define Pir pair<int, int>
#define fi  first
#define se  second
#define pb  push_back
#define m_p make_pair
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
/*==========ACMer===========*/
const int N = 105;
const int maxn = 105;
int n, k, a[N];
struct Bign {
    int n, s[maxn<<1];

    Bign (int t = 0) { init(); s[0] = t; }

    void init () { n = 1; memset(s, 0, sizeof(s)); }
    void add(const Bign& a) {
        int res = 0;
        for (int i = 0; i < a.n || i < n; i++) {
            if (i < a.n) res += a.s[i];
            if (i < n) res += s[i];
            s[i] = res % 10;
            res /= 10;
        }

        n = max(a.n, n);
        while (res) {
            s[n++] = res % 10;
            res /= 10;
        }
    }
}dp[N][N], ONE(1);

int main()
{
    while (scanf("%d %d", &n, &k) != EOF)
    {
        for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
        memset(dp, 0, sizeof dp);
        a[0] = -1;
        dp[0][0] = 1;
        for (int i = 1; i <= n; i ++)
        {
            for (int j = 1; j <= k; j ++)
            {
                for (int x = 0; x < i; x ++)
                {
                    if (a[i] > a[x])
                        dp[i][j].add(dp[x][j - 1]);
                }
            }
        }

        Bign ans = 0;
        ans.init();
        for (int i = 1; i <= n; i ++)
            ans.add(dp[i][k]);
        for (int i = ans.n - 1; i >= 0; i --)
            printf("%d", ans.s[i]);
        printf("\n");
    }

    return 0;
}


大数模板 1

  1. 这个板子只能 +、- 、*
#include <bits/stdc++.h>
using namespace std;

const int N =1005;

struct bign
{
    int len,s[N];
    bign()  {  memset(s,0,sizeof(s));  len=1;  }
    bign(int num)  {  *this=num; }
    bign(char *num) { *this=num; }
    bign operator =(int num)
    {
        char c[N];
        sprintf(c,"%d",num);
        *this=c;
        return *this;
    }
    bign operator =(const char *num)
    {
        len=strlen(num);
        for (int i=0;i<len;i++) s[i]=num[len-1-i]-'0';
        return *this;
    }
    string str()
    {
        string res="";
        for (int i=0;i<len;i++) res=(char)(s[i]+'0')+res;
        return res;
    }
    void clean()
    {
        while (len>1&&!s[len-1]) len--;
    }
    bign operator +(const bign &b)
    {
        bign c;
        c.len=0;
        for (int i=0,g=0;g||i<len||i<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;
        }
        return c;
    }
    bign operator -(const bign &b)
    {
        bign c;
        c.len=0;
        int x;
        for (int i=0,g=0;i<len;i++)
        {
            x=s[i]-g;
            if (i<b.len) x-=b.s[i];
            if (x>=0) g=0;
            else{
                x+=10;
                g=1;
            };
            c.s[c.len++]=x;
        }
        c.clean();
        return c;
    }
    bign operator *(const bign &b)
    {
        bign c;
        c.len=len+b.len;
        for (int i=0;i<len;i++) for (int j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
        for (int i=0;i<c.len-1;i++) { c.s[i+1]+=c.s[i]/10; c.s[i]%=10; }
        c.clean();
        return c;
    }
    bool operator <(const bign &b)
    {
        if (len!=b.len) return len<b.len;
        for (int i=len-1;i>=0;i--)
             if (s[i]!=b.s[i]) return s[i]<b.s[i];
        return false;
    }
    bign operator +=(const bign &b)
    {
        *this=*this+b;
        return *this;
    }
    bign operator -=(const bign &b)
    {
        *this=*this-b;
        return *this;
    }
};
istream& operator >>(istream &in,bign &x)
{
  string s;
  in>>s;
  x=s.c_str();
  return in;
}
ostream& operator <<(ostream &out,bign &x)
{
    out<<x.str();
    return out;
}

//赋值举例
bign ans="0";
bign prime[30]={"2","3","5","7","11","13","17","19","23","29","31","33","37","41","43"};


int main()
{
    char s[1000];
    cin >> s;
    bign a = 100;
    bign b = "1000";
    bign c = s;

    cout << a << endl;
    cout << b << endl;
    cout << c << endl;

    bign x = a + b;
    bign y = b - a;             //只能 大数 - 小数
    bign z = a * b;
    cout << x << endl;
    cout << y << endl;
    cout << z << endl;

    return 0;
}


大数模板 2

#include <bits/stdc++.h>
using namespace std;
#define ll long long 

struct BigInt
{
    const static int mod=10000;
    const static int LEN=4;
    int a[800], len;
    BigInt()
    {
        memset(a,0,sizeof(a));
        len=1;
    }
    void init(int x)
    {
        memset(a,0,sizeof(a));
        len=0;
        do//四位一存 如123456789存为 6789 2345 1
        {
            a[len++]=x%mod;
            x/=mod;
        }while(x);
    }
    void Init(const char s[])//重点 123 4567
    {
        memset(a,0,sizeof(a));
        int l=strlen(s),res=0;
        len=l/LEN;
        if(l%LEN)len++;     //l/LEN 向上取整 len=2 表明需要两个字节能存下
        for(int i=l-1;i>=0;i-=LEN)
        {
            int t=0,k=max(i-LEN+1,0);//k是找到当前字节的最高位 回退len-1长 防越界
            for(int j=k;j<=i;j++)t=t*10+s[j]-'0';//从4开始 t临时存储4567
            a[res++]=t;     //将低位存入
        }
    }

    int Compare(const BigInt &b)//位多的大
    {
        if(len<b.len)return -1;
        if(len>b.len)return 1;
        for(int i=len-1;i>=0;i--)//从高位比较
            if(a[i]<b.a[i])return -1;
            else if(a[i]>b.a[i])return 1;
        return 0;//完全相等的情况
    }

    BigInt operator +(const BigInt &b)const
    {
        BigInt ans;
        ans.len=max(len,b.len);
        for(int i=0;i<ans.len;i++)
        {
            ans.a[i]+=((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0);//防止越位现象
            ans.a[i+1]+=ans.a[i]/mod;//向高位进位
            ans.a[i]%=mod;
        }
        if(ans.a[ans.len]>0)ans.len++;//产生了9999+9999=9998 1的数组高位进位
        return ans;
    }

    BigInt operator -(const BigInt &b)const//确保被减数大 差为正
    {
        BigInt ans;
        ans.len=len;
        int k=0;
        for(int i=0;i<ans.len;i++)
        {
            ans.a[i]=a[i]+k-b.a[i];
            if(ans.a[i]<0)ans.a[i]+=mod,k=-1;//向a[i]高位借10000,k=-1下轮生效
            else k=0;
        }
        while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--;//把前缀0去掉 如果ans.len=1时说明a=b差为0
        return ans;
    }
    BigInt operator *(const BigInt &b)const
    {
        BigInt ans;
        for(int i=0;i<len;i++)
        {
            int k=0;
            for(int j=0;j<b.len;j++)
            {
                int temp=a[i]*b.a[j]+ans.a[i+j]+k;//模拟小学生乘法 i*j加到i+j上去 k为低位来的进位
                ans.a[i+j]=temp%mod;
                k=temp/mod;//k为向高位进的位 下一轮生效
            }
            if(k!=0) ans.a[i+b.len]=k;//高位进位 99*99=9801 右起第1位*右起第1位还是能到右起第3位的
        }
        ans.len=len+b.len;//4位数*4位数不会超过8位数
        while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--;//查出实际长度
        return ans;
    }
    BigInt operator /(const int &n)const//被确保被除数大 商为正
    {
        BigInt ans;
        ans.len=len;
        int k=0;
        for(int i=ans.len-1;i>=0;i--)
        {
            k=k*mod+a[i];//k=上一位来的退位*10000+这一位
            ans.a[i]=k/n;//这一位除以n
            k=k%n;//这一位除以n的余数送给下一位,i=0最后一位如57/28余的1直接丢掉 取整
        }
        while(ans.a[ans.len-1]==0&&ans.len>1)ans.len--;
        return ans;
    }
    ll operator %(const int &n)const
    {
        ll ans=0;
        for(int i=len-1;i>=0;i--)
        {
            ans=ans*mod+a[i];
            if(ans>n)ans%=n;
        }
        return ans;
    }
    void output()
    {
        printf("%d",a[len-1]);//是多少就是多少 没有前缀0
        for(int i=len-2;i>=0;i--)
            printf("%04d",a[i]);//包含前缀0 如0001
        printf("\n");
    }
};


int main()
{
    BigInt x, y, z;
    char s[] = "12345";
    char t[] = "111";
    x.Init(s);
    y.Init(t);
    z = x + y;
    z.output();
    z = x - y;
    z.output();
    z = x * y;
    z.output();

    return 0;
}


大数模板 3

例题传送门

#include <stdio.h>
#include <string.h>
#include <math.h>


#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)

const int MAXSIZE = 1005;

struct bign {
    int s[MAXSIZE];
    bign ()	{memset(s, 0, sizeof(s));}
    bign (int number) {*this = number;}
    bign (const char* number) {*this = number;}

    void put();
    bign mul(int d);
    void del();

    bign operator =  (char *num);
    bign operator =  (int num);

    bool operator <  (const bign& b) const;
    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); }

    bign operator + (const bign& c);
    bign operator * (const bign& c);
    bign operator - (const bign& c);
    int  operator / (const bign& c);
    bign operator / (int k);
    bign operator % (const bign &c);
    int  operator % (int k);
    void operator ++ ();
    bool operator -- ();
};

bign bign::operator = (char *num) {
    s[0] = strlen(num);
    for (int i = 1; i <= s[0]; i++)
        s[i] = num[s[0] - i] - '0';
    return *this;
}

bign bign::operator = (int num) {
    char str[MAXSIZE];
    sprintf(str, "%d", num);
    return *this = str;
}

bool bign::operator < (const bign& b) const {
    if (s[0] != b.s[0])
        return s[0] < b.s[0];
    for (int i = s[0]; i; i--)
        if (s[i] != b.s[i])
            return s[i] < b.s[i];
    return false;
}

bign bign::operator + (const bign& c) {
    int sum = 0;
    bign ans;
    ans.s[0] = max(s[0], c.s[0]);

    for (int i = 1; i <= ans.s[0]; i++) {
        if (i <= s[0]) sum += s[i];
        if (i <= c.s[0]) sum += c.s[i];
        ans.s[i] = sum % 10;
        sum /= 10;
    }
    return ans;
}

bign bign::operator * (const bign& c) {
    bign ans;
    ans.s[0] = 0; 

    for (int i = 1; i <= c.s[0]; i++){  
        int g = 0;  

        for (int j = 1; j <= s[0]; j++){  
            int x = s[j] * c.s[i] + g + ans.s[i + j - 1];  
            ans.s[i + j - 1] = x % 10;  
            g = x / 10;  
        }  
        int t = i + s[0] - 1;

        while (g){  
            ++t;
            g += ans.s[t];
            ans.s[t] = g % 10;
            g = g / 10;  
        }  

        ans.s[0] = max(ans.s[0], t);
    }  
    ans.del();
    return ans;
}

bign bign::operator - (const bign& c) {
    bign ans = *this;
    for (int i = 1; i <= c.s[0]; i++) {
        if (ans.s[i] < c.s[i]) {
            ans.s[i] += 10;
            ans.s[i + 1]--;;
        }
        ans.s[i] -= c.s[i];
    }

    for (int i = 1; i <= ans.s[0]; i++) {
        if (ans.s[i] < 0) {
            ans.s[i] += 10;
            ans.s[i + 1]--;
        }
    }

    ans.del();
    return ans;
}

int bign::operator / (const bign& c) {
    int ans = 0;
    bign d = *this;
    while (d >= c) {
        d = d - c;
        ans++;
    }
    return ans;
}

bign bign::operator / (int k) {
    bign ans; 
    ans.s[0] = s[0];
    int num = 0;  
    for (int i = s[0]; i; i--) {  
        num = num * 10 + s[i];  
        ans.s[i] = num / k;  
        num = num % k;  
    }  
    ans.del();
    return ans;
}

int bign:: operator % (int k){  
    int sum = 0;  
    for (int i = s[0]; i; i--){  
        sum = sum * 10 + s[i];  
        sum = sum % k;  
    }  
    return sum;  
} 

bign bign::operator % (const bign &c) {
    bign now = *this;
    while (now >= c) {
        now = now - c;
        now.del();
    }
    return now;
}

void bign::operator ++ () {
    s[1]++;
    for (int i = 1; s[i] == 10; i++) {
        s[i] = 0;
        s[i + 1]++;
        s[0] = max(s[0], i + 1);
    }
}

bool bign::operator -- () {
    del();
    if (s[0] == 1 && s[1] == 0) return false;

    int i;
    for (i = 1; s[i] == 0; i++)
        s[i] = 9;
    s[i]--;
    del();
    return true;
}

void bign::put() {
    if (s[0] == 0)
        printf("0");
    else
        for (int i = s[0]; i; i--)
            printf("%d", s[i]);
}

bign bign::mul(int d) {
    s[0] += d;
    for (int i = s[0]; i > d; i--)
        s[i] = s[i - d];
    for (int i = d; i; i--)
        s[i] = 0;
    return *this;
}

void bign::del() {
    while (s[s[0]] == 0) {
        s[0]--;
        if (s[0] == 0) break;
    }
}

int n, m;
bign dp[17], one = 1;

void sov(int n, int m)
{
    dp[0] = 1;
    for (int j = 1; j <= m; j ++)
    {
        dp[j] = 1;
        for (int k = 0; k < n; k ++)
        {
            dp[j] = dp[j] * dp[j - 1];
        }
        dp[j] = dp[j] + one;
    }

    (dp[m] - dp[m - 1]).put();
    printf("\n");
}


int main()
{
    while (scanf("%d %d", &n, &m) && n + m)
    {
        printf("%d %d ", n, m);
        if (m == 0) printf("1\n");
        else sov(n, m);
    }

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值