大整数类型!

Posted morning-glory

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大整数类型!相关的知识,希望对你有一定的参考价值。

下面是本人自己做的一个大整数类型,需要的可以拿走用,可以节约很多时间,用的时候注意没有负数,想要练习重载运算符也可以看一下,有不好的地方欢迎指出

 

  1 //该Int 类型只能 ++i,不能i++
  2 //不支持负数运算 
  3 long long ten_pow (int x)//求出10的x次方 
  4 {
  5     long long res=1,s=10;
  6     while (x){
  7         if (x&1)    res*=s;
  8         s*=s;
  9         x>>=1;
 10     }
 11     return res;
 12 }
 13 struct Int{
 14     int num[101];
 15     bool fs;//是否是负数,不过现在还不支持负数运算 
 16     Int(){fs=false;memset(num,0,sizeof(num));num[0]=1;}//初始化负数为非负数,数字为0  
 17     Int & operator = (Int x){
 18         //重载赋值号 同类型赋值将所有状态赋过来即可
 19         fs=x.fs; 
 20         memset(this->num,0,sizeof(this->num));
 21         for (int i=0;i<=x.num[0];i++)    num[i]=x.num[i];
 22         //将改变后的只返回,可以连续赋值 
 23         return *this;
 24     }
 25     Int operator = (long long x){
 26         //先将x转为该类型,再原样赋值 
 27         int i=1;
 28         memset(this->num,0,sizeof(this->num));
 29         if (x<0)    fs=true,x=-x;
 30         while (x)    num[++num[0]]=x%10,x/=10;
 31         for (int i=1;i<=num[0]/2;i++) swap(num[i],num[num[0]-i+1]);
 32         return *this;
 33     }
 34     bool operator == (Int x){
 35         //重载==号
 36         if (fs^x.fs||num[0]!=x.num[0])    return false;//符号不同或长度不同即可返回不同 
 37         for (int i=1;i<=num[0];i++)    if (num[i]!=x.num[i])    return false;//一个一个去比较 
 38         return true;
 39     }
 40     bool operator < (Int x){
 41         //重载小于号 
 42         if (num[0]<x.num[0])    return true;
 43         if (num[0]>x.num[0])    return false;
 44         for (int i=num[0];i>=1;i--)
 45             if (num[i]<x.num[i])    return true;
 46             else if (num[i]>x.num[i])    return false;
 47         return false;//默认> 
 48     }
 49     bool operator <= (Int x){
 50         //重载<=号 
 51         if (num[0]<x.num[0])    return true;
 52         if (num[0]>x.num[0])    return false;
 53         for (int i=num[0];i>=1;i--)
 54             if (num[i]<x.num[i])    return true;
 55             else if (num[i]>x.num[i])    return false;
 56         return true;//默认是<=的 
 57     }
 58     bool operator > (Int x){
 59         //在已经重载了<=号时,便可以直接调用了 
 60         return !(*this<=x); 
 61     }
 62     bool operator >= (Int x){
 63         //同理 
 64         return !(*this<x);
 65     }
 66     Int operator * (Int x){
 67         //重载*号 
 68         //下面是正常高精模板 
 69         Int y;
 70         y.num[0]=num[0]+x.num[0];
 71         for (int i=1;i<=num[0];i++)
 72             for (int j=1;j<=x.num[0];j++){
 73                 y.num[i+j-1]+=num[i]*x.num[j];
 74                 if (y.num[i+j-1]>=10){
 75                     y.num[i+j]+=y.num[i+j-1]/10;
 76                     y.num[i+j-1]%=10;
 77                 }    
 78             }
 79         while (y.num[0]>1&&!y.num[y.num[0]])    --y.num[0];//留一个长度表示0 
 80         return y;
 81     }
 82     Int operator * (long long x){
 83         //同样现将x转化,再调用已重载过的运算符 
 84         Int y;
 85         while (x){
 86             y.num[++y.num[0]]=x%10;
 87             x/=10;
 88         }
 89         return *this*y;
 90     }
 91     Int operator + (Int x){
 92         //重载+号,下面是正常高精加 
 93         Int y;
 94         y.num[0]=max(num[0],x.num[0])+1;
 95         for (int i=1;i<=y.num[0];i++){
 96             y.num[i]+=x.num[i]+num[i];
 97             if (y.num[i]>=10){
 98                 y.num[i+1]=y.num[i]/10;
 99                 y.num[i]%=10;
100             }
101         }
102         while (y.num[0]>1&&!y.num[y.num[0]])    --y.num[0];
103         return y;
104     }
105     Int operator + (long long x){
106         //同理 
107         Int y;
108         while (x){
109             y.num[++y.num[0]]=x%10;
110             x/=10;
111         }
112         return (y+*this);
113     }
114     //下面同样的 
115     Int operator += (Int x){
116         *this=*this+x;
117         return *this;
118     }
119     Int operator += (long long x){
120         *this=*this+x;
121         return *this;
122     }
123     Int operator ++ (){
124         *this=*this+1;
125         return *this;
126     }
127     Int operator *= (Int x){
128         *this=*this*x;
129         return *this;
130     }
131     Int operator *= (long long x){
132         *this=*this*x;
133         return *this;
134     }
135     Int operator - (Int x){
136         //重载-号,下面是正常模板 
137         Int y;
138         int t;
139         y.num[0]=num[0];
140         for (int i=1;i<=num[0];i++){
141             y.num[i]+=num[i]-x.num[i];
142             if (y.num[i]<0){
143                 y.num[i]+=10;
144                 y.num[i+1]--;
145             }
146         }
147         while (y.num[0]>1&&!y.num[y.num[0]])    y.num[0]--;
148         return y;
149     }
150     Int operator -= (Int x){
151         *this=*this-x;
152         return *this;
153     }
154     Int operator / (Int x){
155         //重载除号 
156         Int y,z,tans;//tans记录答案 
157         y=*this;
158         for (int i=num[0];i>=0;i--){
159             z=x*ten_pow(i);//这里就用到10的幂次方了,一个一个去减的话太慢了,这样可以少很多次 
160             while (z<=y)    y-=z,tans+=ten_pow(i);
161         }
162         return tans;
163     }
164     Int operator /= (Int x){
165         *this=*this/x;
166         return *this;
167     }
168     Int operator % (Int x){
169         // 和除法一样输出剩下的数就好 
170         Int y,z;
171         y=*this;
172         for (int i=num[0];i>=0;i--){
173             z=x*ten_pow(i);
174             while (z<=y)    y-=z;
175         }
176         return y;
177     }
178     Int operator %= (Int x){
179         *this=*this%x;
180         return *this;
181     }
182     friend ostream & operator <<(ostream & os,Int x){
183         if (x.fs)    os<<-;//是负数就先输出-号,虽然现在没什么用 
184         for (int i=x.num[0];i;i--)    os<<x.num[i];
185         return os;
186     }
187     friend istream & operator >>(istream & is,Int &x){
188         char s[10001];//输入可以先输入一个char型 再慢慢 赋值 
189         is>>s+1;
190         x.num[0]=strlen(s+1);
191         for (int i=x.num[0];i>0;i--)    x.num[i]=s[x.num[0]-i+1]-0;
192         if (x.num[0]<0){x.num[0]=-x.num[0];x.fs=true;}
193         return is;
194     }
195 }; 

 

以上是关于大整数类型!的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

THREE.js - 大型int作为Uniform

JavaScript笔试题(js高级代码片段)

C语言两个特别大的整数类型相加超出范围使用两个技巧

两大基本数据类型 - 整数类型 / 浮点数类型

如何绕过将数据模型传递给片段参数以避免事务太大异常?