线性表- 大整数操作

来源:互联网 发布:苹果5如何用移动4g网络 编辑:程序博客网 时间:2024/05/22 12:18

对于大整数/多项式的操作,我们往往的实现手段都是把其封装成一个类,在其中定义对它的操作。

  • 数据组织 可以用字符串的形式读入,然后转换成数组。
  • 必要的时候可以进行倒置
  • 计算操作的时候常常运用 &/ % / /

POJ十进制数转二进制数

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1008;char s[N];struct Tbign{    int len, a[N];    Tbign()    {        len = 0; memset(a, 0, sizeof(a));    }    void read()    {        scanf("%s", s + 1);        len = strlen(s + 1);        for (int i = 1; i <= len; i++)            a[i] = s[len - i + 1] - '0';        while (len > 1 && !a[len]) len--;    }    void write()    {        for (int i = len; i >= 1; i--) printf("%d", a[i]);            printf("\n");    }    Tbign operator / (const int x) const    {        Tbign c; int cur = 0;        c.len = len;         for (int i = len; i >= 1; i--)        {            cur = cur * 10 + a[i];            c.a[i] = cur / x;            cur %= x;        }        while (c.len > 1 && !c.a[c.len]) c.len--;        return c;    }}A, B;int main(){#ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);#endif    A.read();    while (A.len && A.a[A.len])    {        B.a[++B.len] = A.a[1] & 1;        A = A / 2;    }    B.write();#ifndef ONLINE_JUDGE    fclose(stdin); fclose(stdout);#endif    return 0;}

写一版完整的封装到类的大整数操作
注意点:

  • C.len A.len len 不要弄错了 如果觉得易错 那么就在外面分开用A、B写
  • 乘法长度回变为原来的两倍 数组大小不要开小了
  • 字符串到数字 要-‘0’
  • 是+= 不是= 的时候注意
#include <iostream>#include <string.h>using namespace std;const int N = 405;const int pp = 10;struct Tbign{    int len;    int num[N];    char s[N];    Tbign()    {        memset(num,0,sizeof(num));        len = 1;    }    void Read()    {        scanf("%s",s);        len = strlen(s);        for(int i = 1; i <= len; i++)            num[i] = s[len - i] - '0';    }    void Write()    {        for(int i = len; i > 0; i--)            printf("%d",num[i]);        printf("\n");    }}A,B,C;Tbign operator + (const Tbign &A, const Tbign & B){    Tbign C;    C.len = max(A.len, B.len);    for(int i = 1; i <= C.len; i++)    {        C.num[i] += A.num[i] + B.num[i];        C.num[i+1] += C.num[i] /pp;        C.num[i] %= pp;    }    if(C.num[C.len+1]) C.len++;    return C;}Tbign operator - (const Tbign &A, const Tbign &B){    Tbign C;    C.len = A.len;    for(int i = 1; i <= C.len;i++)    {        C.num[i] += A.num[i] - B.num[i];        if(C.num[i] < 0) C.num[i] += pp, C.num[i+1]--;    }    while(C.num[C.len] == 0 && C.len > 1) C.len--;    return C;}Tbign operator * (const Tbign &A, const Tbign &B){    Tbign C;    C.len = A.len + B.len - 1;    //printf("C.len:%d",C.len);    for(int i = 1; i <= A.len; i++)    {        for(int j = 1; j <= B.len; j++)        {            C.num[i+j-1] += A.num[i] * B.num[j];            C.num[i+j] += C.num[i+j-1]/pp;            C.num[i+j-1] %= pp;        }    }    if(C.num[C.len+1]) C.len++;    while(C.num[C.len] == 0 && C.len > 1) C.len--;    //printf("C.len:%d",C.len);    return C;}Tbign operator /(const Tbign & A,const int x){    Tbign C;    int cur = 0;    C.len = A.len;    for(int i = C.len; i > 0; i--)    {        cur = cur*pp +  A.num[i];        C.num[i] = cur / x;        cur %= x;    }    while(C.num[C.len] == 0 && C.len > 1) C.len--;    return C;}int main(){#ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);#endif     A.Read();    B.Read();    C = A * B;    C.Write();    Tbign D;    //D = A/2;    //D.Write();    return 0;#ifndef ONLINE_JUDGE    fclose(stdin); fclose(stdout);#endif}
原创粉丝点击