热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[中等]比较完整的BigInteger高精度整数类(C++实现)

首先有读者可能觉得写一个高精度整数不是必备技能吗,怎么还算中等难度,应该算容易啊。我之所以将其划为中等难度,是因为确实本身写一个高精度整数是必备技能,而且其思想基本就是手算的思想,思想并

       首先有读者可能觉得写一个高精度整数不是必备技能吗,怎么还算中等难度,应该算容易啊。我之所以将其划为中等难度,是因为确实本身写一个高精度整数是必备技能,而且其思想基本就是手算的思想,思想并不难,但是要想写一个比较完整而且没有错误的高精度整数类不是那么容易,编码上细节较多,容易出错,因此特将其划为中等难度。这并不影响其为一个必备技能。


       其中BigInteger/BigInteger用得应该会少一些,下面代码中的这个函数需要进一步的测试,不过其思想并不难。

另外对于求模运算,可以容易地通过除法运算的代码获得。


具体代码:

#include 
#include
#include

using namespace std;
struct BigInteger
{
vector s;
static const int BASE=10000;
static const int %d",&x);
s.push_back(x);
}
standardize();
return *this;
}
BigInteger operator + (const BigInteger& rhs) const
{
int size=max(s.size(),rhs.s.size());
int carry=0;
BigInteger ans;
for(int i=0;i {
int sum=carry;
if(i if(i carry=sum/BASE;
ans.s.push_back(sum%BASE);
}
if(carry>0)
{
ans.s.push_back(carry);
}
return ans;
}
BigInteger operator * (const BigInteger& rhs) const
{
BigInteger ans;
for(int i=0;i {
BigInteger lans;
for(int k=0;k int carry=0;
for(int j=0;j {
int result=rhs.s[i]*s[j]+carry;
carry=result/BASE;
lans.s.push_back(result%BASE);
}
while(carry>0)
{
lans.s.push_back(carry%BASE);
carry/=BASE;
}
ans=ans+lans;
}
return ans;
}
BigInteger operator - (const BigInteger& rhs) const
{
BigInteger ans;
int carry=0;
for(int i=0;i {
int diff=s[i]-carry;
if(i carry=0;
while(diff<0)
{
++carry;
diff+=BASE;
}
ans.s.push_back(diff);
}
ans.standardize();
return ans;
}
BigInteger operator / (int rhs) const
{
BigInteger ans;
vector t;
long long rmder=0;
for(int i=s.size()-1;i>=0;--i)
{
long long temp=rmder*BASE+s[i];
long long div=temp/rhs;
rmder=temp%rhs;
t.push_back(div);
}
for(int i=t.size()-1;i>=0;--i)
ans.s.push_back(t[i]);
ans.standardize();
return ans;
}

friend ostream& operator <<(ostream& out,const BigInteger& rhs)
{
out< for(int i=rhs.s.size()-2;i>=0;--i)
{
char buf[5];
sprintf(buf,"%04d",rhs.s[i]);
cout< }
return out;
}
bool operator <(const BigInteger& rhs) const
{
if(s.size()!=rhs.s.size()) return s.size() for(int i=s.size()-1;i>=0;--i)
{
if(s[i]!=rhs.s[i])
return s[i] }
return false;
}
};
//The function below need more tests.
//This function is generally the most difficult. Meanwhile, that means it is rarely used.
BigInteger operator / (const BigInteger& a,const BigInteger& b)
{
BigInteger rmder,x,xbk,rslt;
rmder=a;
x=xbk=b;
int baseNum=0;
while(1)
{
x=x*10;
if(x {
++baseNum;
xbk=x;
continue;
}

int div=0;
while(xbk<=rmder)
{
++div;
rmder=rmder-xbk;
}
if(div==0)
break;

BigInteger t;
for(int i=0;i {
t.number.push_back(0);
}
t.number.push_back(div);
rslt=rslt+t;

baseNum=0;
x=xbk=b;
}
rslt.rmZero();
return rslt;
}
int main()
{
BigInteger A,B,C,D;
A="100";
B=1;
int t=10;
cout< cout< cout< cout<<"A+B:"< if(B cout<<"A-B:"< else
cout<<"B-A:"< cout<<"A*B:"< cout<<"A/t:"< return 0;
}



推荐阅读
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
author-avatar
云中之锦书
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有