大整数类型!

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

  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 }; 

原文地址:https://www.cnblogs.com/Morning-Glory/p/9787979.html

时间: 2024-10-22 02:04:21

大整数类型!的相关文章

大整数算法[01] 大整数的表示和相关定义

★ 相关的数据类型定义 在干正事之前,先定义好各种数据类型还是很有必要的,避免在以后的编码中引起混乱. uintX   X位无符号整形,如uint32表示32位无符号整形 intX    X位有符号整形,如int32表示32位有符号整形 基本数据类型定义: #ifdef _MSC_VER            typedef __int8              int8;            typedef __int16             int16;            typ

[Nowcoder] 大整数相乘(拼多多笔试题)

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 输入例子1: 72106547548473106236 982161082972751393 输出例子1: 70820244829634538040848656466105986748 大数乘法问题 简单来说就是把A[i]*B[j]累加放到临时数组的C[i+j]位置. 然后对数组C执行进位加法即可. 剩下

大整数相乘问题总结以及Java实现

最近在跟coursera上斯坦福大学的算法专项课,其中开篇提到了两个整数相乘的问题,其中最简单的方法就是模拟我们小学的整数乘法,可想而知这不是比较好的算法,这门课可以说非常棒,带领我们不断探索更优的算法,然后介绍可以通过使用分而治之的思想来解决这个问题.下面对该问题的方法以及实现进行介绍. 问题定义 输入:2个n位的整数x和y 输出:x * y 如求: 1234567891011121314151617181*2019181716151413121110987654 的结果 求解该问题要注意的是

大整数相乘“分治法”和“循环暴力法”

前言 今天刷到一道很有趣的面试题,感觉很有意思,来分享给大家. 题目描述 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述:空格分隔的两个字符串,代表输入的两个大整数输出描述:输入的乘积,用字符串表示 示例1 输入72106547548473106236 982161082972751393输出70820244829634538040848656466105986748 思路分析 例如x=1234,y=567 ①将x拆分成两半儿,a =

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

一.整数与浮点数之间的区别 两者的存储方式不一样,整数是直接以二进制形式进行存储,对于浮点数,需要将小数部分和指数部分分开存储.两者之间的区别还有如下: 1-整数没有小数部分,浮点数有小数部分: 2-浮点数可以表示的范围比整数大: 3-对于一些算术运算(两个很大的数相减),浮点数损失的精度更多: 4-在任何区间内都存在着无数个实数,所以计算机的浮点数不能表示区间内的所有值,通常只是实际值的近似值: 5-过去,浮点运算比整数运算慢,不过,有了浮点处理器,速度上的差距有了一定的缩小. 二.整数 in

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

大整数乘法python3实现

由于python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,但是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位置开始算的.代码如下: import sys def list2str(li): while li[0]==0: del li[0] res='' for i in li: res+=str(i) return res def multi(stra,strb): aa=list(stra) bb=l

MySQL数据类型--------整数类型实战

1. 背景 * MySQL支持SQL标准整数类型整数(或INT)和SMALLINT.作为标准的扩展,MySQL还支持整数类型TINYINT.MEDIUMINT和BIGINT 2.  整数类型所需的存储和值范围 类型 占用空间 最小值 最大值 (字节) (signed/Unsigned) (signed/Unsigned) TINYINT 1 -128 127 0 255 SMALLINT 2 -32768 32767 0 65535 MEDIUMINT 3 -8388608 8388607 0

大整数算法[00] 概述

★ 为啥要做这个 早在大一的时候,我便对密码学产生兴趣.那时在计算机导论后面看到RSA加密的计算原理,觉得十分有趣,于是就很想自己实现一个RSA加密,不过我很快就放弃了,因为实在搞不定那超长的整数计算.C里面最长的整数类型也就64位,对于动辄就1024位的RSA密钥,这连个零头都没有.为了完成这个目标,我便开始琢磨着弄一个用来计算大整数的库.原本我也打算使用别人已经写好的大数库,不过最终还是决定自己搞一个,因为凡是效率高速度快的大数库 (OpenSSL, Crypto++, GMP),要么使用的