c++重庆大学 2022级-第七次作业-类

6-1 设计实现大整数类

分数 30

作者 葛亮

单位 重庆大学

设计实现“HugeInteger” 大整数类,实现大整数的加法、输入和输出功能。能够满足以下程序的运行:

#include <iostream>
#include <string>
using namespace std;

/* 请在这里写出HugeInteger类的定义和实现 */


int main()
{
   HugeInteger n1( 7654321 );
   HugeInteger n2( 7891234 );
   HugeInteger n3( "99999999999999999999999999999" );
   HugeInteger n4( "1" );
   HugeInteger n5;
   cout << "n1 is " << n1 << "\nn2 is " << n2
      << "\nn3 is " << n3 << "\nn4 is " << n4
      << "\nn5 is " << n5 << "\n\n";
   n5 = n1 + n2;
   cout << n1 << " + " << n2 << " = " << n5 << "\n\n";
   cout << n3 << " + " << n4 << "\n= " << ( n3 + n4 ) << "\n\n";
   n5 = n1 + 9;
   cout << n1 << " + " << 9 << " = " << n5 << "\n\n";
   n5 = n2 + "10000";
   cout << n2 << " + " << "10000" << " = " << n5 << endl;
    
    return 0;
}

输入样例:

无。


输出样例:

n1 is 7654321
n2 is 7891234
n3 is 99999999999999999999999999999
n4 is 1
n5 is 0

7654321 + 7891234 = 15545555

99999999999999999999999999999 + 1
= 100000000000000000000000000000

7654321 + 9 = 7654330

7891234 + 10000 = 7901234

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 

考点:

类定义 构造 运算符重载的理解

如何将大整数转化为string进行相加,进位怎么办

#include <iostream>
#include <string>
using namespace std;

/* 请在这里写出HugeInteger类的定义和实现 */
class HugeInteger已知一种算法 可以将str1与str2相加 实现大整数相加  所以如果能找到一种办法让int转化为string 那么问题迎刃而解!
{

public:
    string integer;
    HugeInteger()
    {
        integer = "0";//可有可无
    };

    HugeInteger(int a)
    {           //将int类型转化为HugeInteger类型
        string x;                           //学到一个to_string函数
        x = to_string(a);
        integer = x;
    };
    HugeInteger(string a)
    {        //将string类型转化为HugeInteger类型
        integer = a;
    }

};
ostream& operator<<(ostream& cout, HugeInteger p)
{
    cout << p.integer;
    return cout;
}

HugeInteger operator+(HugeInteger p1, HugeInteger p2)
{
    if (p1.integer.size() < p2.integer.size()) {//把num1固定为位数较大的那个数,方便后面处理
        string temp = p1.integer;
        p1.integer = p2.integer;
        p2.integer = temp;
    }
    int length1 = p1.integer.size(), length2 = p2.integer.size(), flag = 0, a, b, sum;//flag是进位标记
    while (length1 > 0)
    {//从低位开始把对应的位相加
        a = p1.integer[length1 - 1] - '0';//获取num1当前最低位的数字
        if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
            b = p2.integer[length2 - 1] - '0';//获取num2当前位的数字
        else
            b = 0;//如果num2加完了,num2对应位上就没有数来加了
        //这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
        sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
        if (sum >= 10) {//如果加起来大于于10,那就需要进位了
            p1.integer[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
            flag = 1;//把进位标记置1
        }
        else {
            p1.integer[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
            flag = 0;//把进位标记置0
        }
        length1--;//向高位移动1位
        length2--;//向高位移动1位
    }
    //如果两个数对应位都加完了,进位位是1,说明位数要增加1了
    //比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
    if (1 == flag)
        p1.integer = "1" + p1.integer;
    return p1.integer;
}
HugeInteger operator+(HugeInteger p1, string p2)
{
    if (p1.integer.size() < p2.size()) {//把num1固定为位数较大的那个数,方便后面处理
        string temp = p1.integer;
        p1.integer = p2;
        p2 = temp;
    }
    int length1 = p1.integer.size(), length2 = p2.size(), flag = 0, a, b, sum;//flag是进位标记
    while (length1 > 0)
    {//从低位开始把对应的位相加
        a = p1.integer[length1 - 1] - '0';//获取num1当前最低位的数字
        if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
            b = p2[length2 - 1] - '0';//获取num2当前位的数字
        else
            b = 0;//如果num2加完了,num2对应位上就没有数来加了
        //这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
        sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
        if (sum >= 10) {//如果加起来大于于10,那就需要进位了
            p1.integer[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
            flag = 1;//把进位标记置1
        }
        else {
            p1.integer[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
            flag = 0;//把进位标记置0
        }
        length1--;//向高位移动1位
        length2--;//向高位移动1位
    }
    //如果两个数对应位都加完了,进位位是1,说明位数要增加1了
    //比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
    if (1 == flag)
        p1.integer = "1" + p1.integer;
    return p1.integer;
}


int main()
{
    HugeInteger n1(7654321);
    HugeInteger n2(7891234);
    HugeInteger n3("99999999999999999999999999999");
    HugeInteger n4("1");
    HugeInteger n5;
    cout << "n1 is " << n1 << "\nn2 is " << n2
        << "\nn3 is " << n3 << "\nn4 is " << n4
        << "\nn5 is " << n5 << "\n\n";
    n5 = n1 + n2;
    cout << n1 << " + " << n2 << " = " << n5 << "\n\n";
    cout << n3 << " + " << n4 << "\n= " << (n3 + n4) << "\n\n";
    n5 = n1 + 9;
    cout << n1 << " + " << 9 << " = " << n5 << "\n\n";
    n5 = n2 + "10000";
    cout << n2 << " + " << "10000" << " = " << n5 << endl;

    return 0;
}

 

注:这个算法很好:

HugeInteger operator+(HugeInteger p1, string p2)
{
    if (p1.integer.size() < p2.size()) {//把num1固定为位数较大的那个数,方便后面处理
        string temp = p1.integer;
        p1.integer = p2;
        p2 = temp;
    }
    int length1 = p1.integer.size(), length2 = p2.size(), flag = 0, a, b, sum;//flag是进位标记
    while (length1 > 0)
    {//从低位开始把对应的位相加
        a = p1.integer[length1 - 1] - '0';//获取num1当前最低位的数字
        if (length2 > 0)//如果num2还没加完(注意,num2是位数较少的)
            b = p2[length2 - 1] - '0';//获取num2当前位的数字
        else
            b = 0;//如果num2加完了,num2对应位上就没有数来加了
        //这时我没有break,因为虽然num2没有数字来加了,但可能还有进位需要加
        sum = a + b + flag;//num1与num2对应位上的数字相加,再加上进位位
        if (sum >= 10) {//如果加起来大于于10,那就需要进位了
            p1.integer[length1 - 1] = '0' + sum % 10;//计算加完之后,当前位应该是多少
            flag = 1;//把进位标记置1
        }
        else {
            p1.integer[length1 - 1] = '0' + sum;//计算加完之后,当前位应该是多少
            flag = 0;//把进位标记置0
        }
        length1--;//向高位移动1位
        length2--;//向高位移动1位
    }
    //如果两个数对应位都加完了,进位位是1,说明位数要增加1了
    //比如99+1,加完之后,变成了三位数100,其实就是再在前面加一位1
    if (1 == flag)
        p1.integer = "1" + p1.integer;
    return p1.integer;
}

//注意理解与转化与运用

感谢各位的期待

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值