问题描述:
#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<<bigNum1bigNum2<<endl;
}
}
return 1;
}