BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。
重载面向BigInt类对象的运算符:
‘>>’
<<
+
裁判测试程序样例:
#include
#include
using namespace std;
/* 请在这里填写答案 */
int main(){
BigInt a, b, c;
cin>>a>>b;
c=a+b;
cout<<a<<"+"<<b<<"="<<c<<endl;
return 0;
}
输入样例:
123456789
987654321
输出样例:
123456789+987654321=1111111110
#include<string.h>
class BigInt {
//因为是100位以内的数进行运算,故应选择字符串来进行操作100
char bigint[100];
public:
BigInt() {}
BigInt(char * b) {
strcpy(bigint, b);
}
//采用友元函数来重载<<,>>,+
//采用传递形参使效率更高
//返回ostream的引用使得<<能够在一个式子中连续使用<<
//否则主函数中只能cout<<b;而不能cout<<a<<b;
//重载>>同理
friend ostream& operator <<(ostream& os, BigInt& b);
friend istream& operator >>(istream& is, BigInt& b);
friend BigInt operator +(BigInt& b1, BigInt& b2);
};
//重载<<运算符
ostream& operator <<(ostream& os, BigInt& b) {
os << b.bigint;
return os;
}
//重载>>运算符
istream& operator >>(istream& is, BigInt& b) {
is >> b.bigint;
return is;
}
//重载+运算符
BigInt operator +(BigInt& b1, BigInt& b2) {
/*由于主函数中执行完加法后还需要用到b1,b2中的数据成员,
故在该函数中另外创建两个string副本来进行操作*/
char a[100], b[100], sum[101] = {'0'};
char t;
int i, size_a, size_b, jin = 0;
//保证a>=b
if (strlen(b1.bigint)>=strlen(b2.bigint)) {
strcpy(a, b1.bigint); strcpy(b, b2.bigint);
}
else {
strcpy(a, b2.bigint); strcpy(b, b1.bigint);
}size_a =strlen(a) ; size_b = strlen(b);
//为了方便进位,将a,b倒着存;
for (i = 0; i < size_a / 2; i++) {
t = a[i]; a[i] = a[size_a - 1 - i]; a[size_a - 1 - i] = t;
}
for (i = 0; i < size_b / 2; i++) {
t = b[i]; b[i] = b[size_b - 1 - i]; b[size_b - 1 - i] = t;
}
for (i = 0; i < size_a; i++)//循环到最大数的位数+1,不排除最后一位进位
{
if(i<size_b)
sum[i] = (a[i] + b[i] - '0'+ jin);
else
sum[i] = a[i] + jin;
jin = 0;
//'3'=1+2+'0'='1'-'0'+'2'-'0'+'0';
if (sum[i] > '9') //进位
{
jin = 1;
sum[i] = (sum[i] - '0') % 10 + '0';
}
}
if(jin==1)
sum[i++]='1';
sum[i]='\0';
//倒着存完再倒过来一遍才能正常输出
int size_sum = strlen(sum);
for (i = 0; i < size_sum / 2; i++) {
t = sum[i]; sum[i] = sum[size_sum - i - 1];
sum[size_sum - i - 1] = t;
}
BigInt bi(sum);
return bi;
}
这个题涉及知识点多,并且对基本的算法有着考察。
最开始我在BigInt中的数据成员本来是声明为string类型的,查到了关于如何取string里的字符,可以采用自带函数at(),或者迭代器,其次string类也重载了[ ],故也可以像字符数组一样使用。但是后面不知道是什么原因编译一直报错我干脆就换成了char*类型
这个题考查很基本的一点就是,通过字符来进行进位操作的算法,剩下的关于运算符重载的也都很简单,遵守语法规则即可。
By Suki