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;
}
//注意理解与转化与运用
感谢各位的期待