题目总结:大整数计算(运算符重载)

本文详细介绍了如何使用C++实现大整数的加法、减法和乘法运算,包括了大整数类的设计和实现过程,以及如何将整型数据转换为字符型数组和反向转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
#include
#include<string.h>
#include
using namespace std;

//用char型数组存整数的整体思路:

/*
1.使用一位作为记录符号位,用’0’表示非负数,用’B’表示负数,初始化时将数组除0下标位置的每一位数据都赋为’A’
(注意:有坑,容易想到用’-1’进行表示,但-1并不是单个 char型数据)
2.传入整型数据,通过取余和相除运算的结合,取出整型数据的个位,十位,百位等等每一位数据,
然后通过与’0’相加得到对应的字符数据
3.将大整数类的字符数组,转换为整型数据:首先通过寻找字符数组中从1下标开始的每一位不为’A’(或者说到’A’截止)的数据,
与’0’相减,得到每一位的数据。在进行与位数相应的乘数(X10,X100,X1000)运算即可。
需要注意的是,存在字符数组下标中低位的数据,对应的也是整形数据中低位的数据,与我们往常阅读一个整数的顺序不太一样,
所以转换的时候要多加小心。

*/
class CBigInteger{
char *p;
public:
CBigInteger(){
p = new char[1002];
for(int i=1;i<1002;i++){
p[i] = ‘A’;
}
p[0] = ‘0’;
}
CBigInteger(char *q){
//根据参数初始化大整数
p = new char[1002];
for(int i=0;i<1002;i++){
p[i] = q[i];
}
}
CBigInteger(const CBigInteger &cb){
p = new char[1002];
for(int i=0;i<1002;i++)
p[i] = cb.p[i];
}
//先把两个CBIG里面的字符串数组的数转换为整数
//然后再把这个整数转换为字符型数
//第一位数用来记录正负
CBigInteger operator + (CBigInteger &cb){
long long num1 = 0, num2 = 0;
long long sum = 0;
for(int i=1;i<1002;i++){
if(p[i]!=‘A’&&cb.p[i]!=‘A’){
num1 += (p[i]-‘0’)*pow(10,i-1);
num2 += (cb.p[i]-‘0’)*pow(10,i-1);
}else if(p[i]!=‘A’){
num1 += (p[i]-‘0’)*pow(10,i-1);
}else if(cb.p[i]!=‘A’){
num2 += (cb.p[i]-‘0’)*pow(10,i-1);
}else{
break;
}
}
if(p[0]‘B’){
num1 = -num1;
}
if(cb.p[0]
‘B’){
num2 = -num2;
}
sum = num1 + num2;
//再转换为char型
char *q = new char[1002];
for(int i=1;i<1002;i++){
q[i] = ‘A’;
}
q[0] = ‘0’;
if(sum<0){
q[0] = ‘B’;
sum = -sum;
}
int i = 1;
do{
q[i] = sum%10 + ‘0’;
sum = sum/10;
i++;
}while(sum!=0);
CBigInteger ing(q);
return ing;
}
CBigInteger& operator = (const CBigInteger &cb){
if(p!=NULL)
delete [] p;
p = new char[1002];
for(int i=0;i<1002;i++)
p[i] = cb.p[i];
return *this;
}
CBigInteger operator - (CBigInteger &cb){
long long num1 = 0, num2 = 0;
long long sum = 0;
for(int i=1;i<1002;i++){
if(p[i]!=‘A’&&cb.p[i]!=‘A’){
num1 += (p[i]-‘0’)*pow(10,i-1);
num2 += (cb.p[i]-‘0’)*pow(10,i-1);
}else if(p[i]!=‘A’){
num1 += (p[i]-‘0’)*pow(10,i-1);
}else if(cb.p[i]!=‘A’){
num2 += (cb.p[i]-‘0’)*pow(10,i-1);
}else{
break;
}
}
if(p[0]‘B’){
num1 = -num1;
}
if(cb.p[0]
‘B’){
num2 = -num2;
}
sum = num1 - num2;
//再转换为char型
char *q = new char[1002];
for(int i=1;i<1002;i++){
q[i] = ‘A’;
}
q[0] = ‘0’;
if(sum<0){
q[0] = ‘B’;
sum = -sum;
}
int i = 1;
do{
q[i] = sum%10 + ‘0’;
sum = sum/10;
i++;
}while(sum!=0);
CBigInteger ing(q);
return ing;
}

CBigInteger operator * (CBigInteger &cb){
	long long  num1 = 0, num2 = 0;
	long long sum = 0;
	int count = 0;
	for(int i=1;i<1002;i++){
		if(p[i]!='A'&&cb.p[i]!='A'){
			num1 += (p[i]-'0')*pow(10,i-1);
			num2 += (cb.p[i]-'0')*pow(10,i-1);
		}else if(p[i]!='A'){
			num1 += (p[i]-'0')*pow(10,i-1);
		}else if(cb.p[i]!='A'){
			num2 += (cb.p[i]-'0')*pow(10,i-1);
		}else{
			break;
		}
		count++;
	}

	if(p[0]=='B'){
		num1 = -num1;
	}
	if(cb.p[0]=='B'){
		num2 = -num2;
	}
	sum = num1 * num2;
	//再转换为char型
	char *q = new char[1002];
	for(int i=1;i<1002;i++){
		q[i] = 'A';	
	}
	q[0] = '0';
	if(sum<0){
		q[0] = 'B';
		sum = -sum;
	}
	int i = 1;
	do{
		q[i] = sum%10 + '0';
		sum = sum/10;	

// cout<<“q”<<i<<": "<<q[i]<<endl;
i++;
// system(“pause”);
}while(sum!=0);
CBigInteger ing(q);
return ing;
}

friend istream& operator >>(istream &input,CBigInteger &cb){
	long long sum;
	input>>sum;
	for(int i=1;i<1002;i++){
		cb.p[i] = 'A';	
	}
	cb.p[0] = '0';
	if(sum<0){
		cb.p[0] = 'B';
		sum = -sum;
	}
	int i = 1;
	do{
		cb.p[i] = sum%10 + '0';
		sum = sum/10;	
		i++;
	}while(sum!=0);
	return input;
}
friend ostream& operator <<(ostream &output,CBigInteger cb){
	if(cb.p[0]=='B'){
		output<<"(-";
		int index = 0;
		for(int i=1;i<1002;i++){
			if(cb.p[i]=='A'){
				index = i-1;
				break;	
			}
		}
		while(index!=0){
			output<<cb.p[index];
			index--;
		}
		output<<")";
	}else{
		int index = 0;
		for(int i=1;i<1002;i++){
			if(cb.p[i]=='A'){
				index = (i-1);
				break;	
			}
		}
		while(index!=0){
			output<<cb.p[index];
			index--;
		}
	}

	return output;
}	
~CBigInteger(){
	if(p!=NULL){
		delete [] p;
		p = NULL;
	}
}

};

int main(){
int t;
char op;
CBigInteger bigNum1;
CBigInteger bigNum2;
cin>>t;
while(t–){
cin>>bigNum1>>op>>bigNum2;
cout<<bigNum1<<" “<<op<<” “<<bigNum2<<” = ";
if(op==’+’){
cout<<bigNum1+bigNum2<<endl;
}
else if(op==’-’){
cout<<bigNum1-bigNum2<<endl;
}
else if(op==’’){
cout<<bigNum1
bigNum2<<endl;
}
}
return 1;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值