处理大整数的一般方法是用数组存储大整数,即开一个比较大的整型数组,数组元素代表大整数的一位,通过数组元素的运算模拟大整数的运算。
#include <iostream> using namespace std; const int MaxSize = 100;//100只是示例性的数据,可以根据实际问题具体定义 template <class DataType>//定义模板SeqList class SeqList { public: SeqList(){length=0;}//无参构造函数,建立一个空的顺序表 SeqList(DataType a[],int n);//有参构造函数,建立一个长度为你,的顺序表 ~SeqList(){} //析构函数 int Length(){return length;}//求线性表长度 DataType Get(int i); //按位查找,在现行表中查找第i个元素 int Locate(DataType x);//按值查找,在线性表中查找值为x的元素 void Insert(int i,DataType x);//在线性表中第i个位置插入值为x的元素 DataType Delete(int i); //删除操作,删除线性表中第i个元素 void PrintList();//便利操作,按序号依次输出个元素 private: DataType data[MaxSize];//存放数据元素的数组 int length;//线性表的长度 }; template<class DataType> SeqList<DataType>::SeqList(DataType a[],int n) { if(n>MaxSize)throw"参数非法"; for(i=0;i<n;i++) { data[i]=a[i]; } length=n; } //顺序表按位查找算法 template <class DataType> DataType SeqList<DataType>::Get(int i) { if(i<1&&i>length) throws "查找位置非法"; else return data[i-1]; } //按值查找算法 template <class DataType> int SeqList<DataType>::Locate(DataType x) { for(i=0;i<length;i++) if(data[i]==x)return i+1; return 0; } //顺序表插入算法 template<class DataType> void SeqList<DataType>::Insert(int i,DataType) { if(length>=MaxSize)throw"上溢"; if(i<1&&i>length+1)throw"位置"; for(i=length;j>=i;j--) data[j]=data[j-1]; data[i-1]=x; length++; } //顺序表的删除操作 template<class DataType> DataType SeqList<DataType>::Delete(int i) { if(length==0)throw"下溢"; if(i<1||i>length)throw"位置"; x=data[i-1]; for(j=i;j<length;j++) data[j-1]=data[j]; length--; return x; } //顺序表的遍历操作 template<class DataType> void SeqList<DataType>::PrintList() { for(i=0;i<length;i++) cout<<data[i]; }
/* 大整数求和算法 Add 伪代码: 1.初始化仅为标志 flag=0; 2.求大整数A和B的长度n=A.length;m=Blength; 3.从各位开始逐位进行第i位的加法,直到A或B计算完 3.1计算第i位的值:C.data[i]=(a.data[i]+b.data[i]+flag)%10; 3.2计算该位的进位;flage=(a.data[i]+b.data[i]+flag)/10; 4.计算大整数A或B余下的部分 5.计算结果位数; */ SqlList<int>Add(Seqlist<int>A,Seqlist<int>B) { flag=0;i=0;//flag为标志位,i为大整数的某一位 n=A.length;m=B.length;//求大整数A和B的位数 while(i<n&&i<m)//逐位进行加法运算直到某个大整数计算完毕 { C.data[i]=(a.data[i]+b.data[i]+flag)%10;//计算第i位的值 flag=(a.data[i]+b.data[i]+flag)/10;//计算第i位的进位 i++; } for(;i<n;i++) { C.data[i]=(A.data[i]+flag)%10; flag=(A.data[i]+flage)/10 } for(;i<m;i++) { C.data[i]=(B.data[i]+flag)%10; flag=(B.data[i]+flage)/10; } c.length=max(m,n)+flage;//如果最后有进位,则结果会多一位 if(flag==1)C.data[C.length]=1; return c; }
大整数求和算法Add
最新推荐文章于 2022-12-19 08:56:14 发布