《算法竞赛入门经典(第2版)》第五章关键 应用:大整数类(BigInteger)

当看见这道应用并尝试解读代码时我绝对是一脸懵逼,不过研究了两天自己也尝试实现了一下,这里不去评论刘老师的代码,先说一些需要掌握的基础知识:

一、运算符重载

运算符重载大的分两种,第一种是成员函数重载,第二种是友元函数重载,查了一下资料,推荐的还是成员函数重载更好一点。具体内容可以从下面网站学习,非常全面:
https://wenku.baidu.com/view/0f30f808a6c30c2259019e31.html
https://wenku.baidu.com/view/b186ef4033687e21af45a9d5.html?sxts=1586509930380
掌握了上面的知识就可以贴代码一步一步分析了

二、代码分析

1、结构体部分

struct BigInteger{
   
    string sr;int fh=1;
    vector<int> sc;
    void printf();
     friend istream&operator>>(istream&input,BigInteger &);
    friend ostream&operator<<(ostream&output,BigInteger &);
};

上面的sr字符串表示输入,即我们输入的每一组数都以一个串的形式被接受,fh变量表示符号,fh=1表示正数,fh=0表示负数,vector形式的sc为输出串。

关于输出我写了两个形式,一种是printf(),还有一种是流输出,当然还有一个流输入,printf()采用的是成员函数形式,流输入输出运算符重载用的是友元函数形式。

注意这个结构体内没有构造函数。

2、printf()的描述和使用以及>>和<<的重载

1)printf()函数

void BigInteger::printf()
{
   
     if(fh==1)
     {
   for(vector<int>::iterator it=sc.end()-1;it!=sc.begin()-1;it--) cout<<*it;}
     if(fh==0)
     {
   
         cout<<'-';
       for(vector<int>::iterator it=sc.end()-1;it!=sc.begin()-1;it--) cout<<*it;
     }
     cout<<endl;
}

首先这一部分是写在结构体外部的,::是域作用符,表示它的作用域为BigInteger结构体。fh为符号变量,fh=1表示结果为正,如果结果为正,那么设置一个迭代器,倒着输出vector形式的sc串中的结果,

注意:对于vector数据类型,遍历最好用迭代器。

还有一个是为什么要倒着输出,因为我在做运算时是使用push_back向sc添加元素的,vector是一种类似队列的结构,而我们四则运算是从个位向十位百位这个方向进行的,存储顺序也是从个位向左存储,而输出又必须从左往右进行,比如480,存储的顺序是084,输出就要倒过来了。

然后是负数的情况,很明显在这里输出了一个负号。

2)>>和<<的重载

istream&operator>>(istream&input,BigInteger &c)
{
   
    input>>c.sr;
    return input;
}

这是输入,我们要输入的即一个未知长度的字符串sr,注意要写返回值,这一部分写在结构体外部。

ostream&operator<<(ostream&output,BigInteger &c)
{
   
    if(c.fh==1)
    {
   for(vector<int>::iterator it=c.sc.end()-1;it!=c.sc.begin(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值