大整数类型!
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 };
以上是关于大整数类型!的主要内容,如果未能解决你的问题,请参考以下文章