首页 > 其他分享 >设计并实现大数类BigNum

设计并实现大数类BigNum

时间:2023-05-25 17:36:59浏览次数:28  
标签:BigNum 大数 int s2 char len1 num 设计

定义一个整数型大数类,要求能够完成100位以内的较大整数的加法和减法计算,main(void)函数完成对其的测试。

BigNum类结构说明:

 
BigNum类的数据成员包括:
①私有数据成员:数值域num(char []型)。
BigNum类成员函数包括:
①有参构造函数BigNum(char c[])和拷贝构造函数BigNum(const  BigNum  &),其中有参构造函数参数默认值为"+0",输出信息"BigNum Constructor run",拷贝构造函数输出信息"BigNum CopyConstructor run"
②析构函数,析构函数输出信息"BigNum Destructor run"
③公有函数成员void  setNum(char c[])和char const *getNum(void) const分别返回和设置数值域。
④重载“+”运算符,实现两个BigNum对象相加的运算
⑤重载“-”运算符,实现两个BigNum对象相减的运算
⑥公有成员函数void show() const用于显示BigNum对象的信息,显示格式为:BigNum(<数值域>)
 

建议:大数存储时专门存储符号位且低位存储在前,高位存储在后。这样便于运算实现。

裁判测试程序样例:

 
#include <iostream>
using namespace std;
#define N 100

/*请在这里填写答案*/

//主函数
int main(void){
    char c[100],op;
    cin>>c;
    BigNum b1(c),b2(b1);
    b1.show();
    cin>>c;
    b2.setNum(c);
    b2.show();
    cin>>op;
    if(op=='+') (b1+b2).show();
    if(op=='-') (b1-b2).show();
    return 0;
}
 

输入样例:

123
234
-
 

输出样例:

BigNum Constructor run
BigNum CopyConstructor run
BigNum(+123)
BigNum(+234)
BigNum Constructor run
BigNum CopyConstructor run
BigNum Destructor run
BigNum(-111)
BigNum Destructor run
BigNum Destructor run
BigNum Destructor run






#include<cstring>
class BigNum
{
private:
char num[N];
public:
BigNum( char c[N] = "+0" );
BigNum( const BigNum &p );
~BigNum()
{
cout<<"BigNum Destructor run"<<endl;
}
void setNum( char c[N] );
char const * getNum(void) const;
BigNum operator + ( const BigNum &a );
BigNum operator - ( BigNum &b );
void show() const;
};


BigNum::BigNum( char c[N] )
{
int i,j,a = strlen(c);
if( c[0] != '-')
{
num[0] = '+';
if( c )
{
for( i=strlen(c), j=0; i>=1; i--,j++)
{
num[i] = c[j];
}
}
num[a+1] = '\0';
}
else
{
num[0] = c[0];
for( i=strlen(c)-1, j=1; i>=1; i--,j++)
{
num[i] = c[j];
}
num[a] = '\0';
}
cout<<"BigNum Constructor run"<<endl;
}

BigNum::BigNum( const BigNum &p )
{
int i=0;
if(p.num)
{
while( p.num[i] != '\0' )
{
num[i] = p.num[i];
i++;
}
num[i] = '\0';
}
cout<<"BigNum CopyConstructor run"<<endl;
}

void BigNum::setNum( char c[N] )
{
int i,j,a = strlen(c);
if( c[0] != '-')
{
num[0] = '+';
if( c )
{
for( i=strlen(c), j=0; i>=1; i--,j++)
{
num[i] = c[j];
}
}
num[a+1] = '\0';
}
else
{
num[0] = c[0];
for( i=strlen(c)-1, j=1; i>=1; i--,j++)
{
num[i] = c[j];
}
num[a] = '\0';
}
}

char const * BigNum::getNum(void) const
{
return num;
}

BigNum BigNum::operator + ( const BigNum &a )
{
if(num[0]=='+' && a.num[0]=='-')
{
BigNum s2(a);
s2.num[0] = '+';
return (*this) - s2;
}
if(num[0]=='-' && a.num[0]=='+')
{
BigNum s2(a);
num[0] = '+';
return s2 - (*this);
}
BigNum s;
int i;
char s2[N];
for( i=0; a.num[i]!='\0'; i++)
{
s2[i] = a.num[i];
}
s2[i] = '\0';
int len1 = strlen(num);
int len2 = strlen(s2);
int Max=0;
if( len1 > len2)
{
Max = len1;
num[len1] = '0';
for( i=len2; i<=len1; i++)
{
s2[i] = '0';
}
}
else
{
if( len1 < len2 )
{
Max = len2;
s2[len2] = '0';
for( i=len1; i<=len2; i++)
{
num[i] = '0';
}
}
else
{
Max = len1;
s2[len2] = '0';
num[len1] = '0';
}
}
if( (num[0]=='+' && s2[0]=='+') || (num[0]=='-' && s2[0]=='-') )
{
for( i=1; i<=Max; i++)
{
int c = ( (num[i]-'0') + (s2[i]-'0') );
if( c>= 10 )
{
c -= 10;
s.num[i] = char( c +'0');
s2[i+1]++;
}
else
{
s.num[i] = char( c + '0');
}
}
s.num[i] = '\0';
if(num[0]=='+' && s2[0]=='+')
{
s.num[0] = '+';
}
if(num[0]=='-' && s2[0]=='-' )
{
s.num[0] = '-';
}
}

return s;
}

BigNum BigNum::operator - ( BigNum &b )
{
if(num[0]=='+' && b.num[0]=='-')
{
BigNum s2(b);
s2.num[0] = '+';
return (*this) + s2;
}
if(num[0]=='-' && b.num[0]=='+')
{
BigNum s2(b);
s2.num[0] = '-';
return (*this) + s2;
}
BigNum s;
int i;
char s2[N];
for( i=0; b.num[i]!='\0'; i++)
{
s2[i] = b.num[i];
}
s2[i] = '\0';
int len1 = strlen(num);
int len2 = strlen(s2);
int Max=0;
if( len1 > len2)
{
Max = len1;
num[len1] = '0';
for( i=len2; i<=len1; i++)
{
s2[i] = '0';
}
}
else
{
if( len1 < len2 )
{
Max = len2;
s2[len2] = '0';
for( i=len1; i<=len2; i++)
{
num[i] = '0';
}
}
else
{
Max = len1;
s2[len2] = '0';
num[len1] = '0';
}
}
if( (num[0]=='+' && s2[0]=='+') || (num[0]=='-' && s2[0]=='-') )
{
if(num[0]=='-' && s2[0]=='-')
{
s2[0] = '+';
num[0] = '+';
for( i=0; num[i]!='\0'; i++ )
{
char ch;
ch = num[i];
num[i] = s2[i];
s2[i] = ch;
}
}
char s1[N];
char s3[N];
int j;
for( i=Max,j=0; i>0; j++,i--)
{
s1[j] = num[i];
}
s1[j] = '\0';
for( i=Max,j=0; i>0; j++,i--)
{
s3[j] = s2[i];
}
s3[j] = '\0';
if( strcmp(s1,s3)>0 )
{
s.num[0] = '+';
for( i=1; i<=Max; i++)
{
int c = ( (num[i]-'0') - (s2[i]-'0'));
if( c<0 )
{
c+=10;
s.num[i] = char( c + '0');
num[i+1]--;
}
else
{
s.num[i] = char( c + '0');
}
}
s.num[i] = '\0';
}
else
{
if( strcmp(s1,s3)<0 )
{
s.num[0] = '-';
for( i=1; i<=Max; i++)
{
int c = ( (s2[i]-'0') - (num[i]-'0'));

if( c<0 )
{
c+=10;
s.num[i] = char( c + '0');

s2[i+1]--;
}
else
{
s.num[i] = char( c + '0');

}
}
s.num[i] = '\0';
}
else
{
s.num[0] = '+';
s.num[1] = '0';
s.num[2] = '\0';
}
}
}
return s;
}

void BigNum::show() const
{
char ch[N] = "+0";
char c[N] = "+00";
//cout<<num<<endl;
if( strcmp(ch,num) == 0 || strcmp(c,num) == 0 )
{
cout<<"BigNum("<<ch<<")"<<endl;
}
else
{
cout<<"BigNum("<<num[0];
int i;
int flag;
for( i=strlen(num)-1; i>=0; i--)
{
if(num[i]!='0')
{
flag = i;
break;
}
}
for( i=flag; i>=1; i--)
{
cout<<num[i];
}
cout<<")"<<endl;
}
}

标签:BigNum,大数,int,s2,char,len1,num,设计
From: https://www.cnblogs.com/zljzy/p/17426236.html

相关文章

  • 〈数据库设计入门经典〉之第一章笔记
        现在,来写一下我看了前三章的体验吧!GO! 第一章数据库建模的过去与现在    呼呼,这一章基本都是在讲一些概念性的东西,所以,应该也没什么感想可写,那就再摘一点“苹果”来分享好了,Ready?GO!数据库:数据库是信息的集合——较为相关的信息和组织良好的信息。数据库由在安......
  • 《数据库设计入门经典》之第二章笔记
        上一次我摘了些第一章的内容,整理成了笔记,不知道对大家有没有点帮助啊,呵呵...第一章主要是讲了些概念上的东西,让大家对基本的概念有点理解,没有摘完全,只是选了我觉得有概括性的语句。现在,来写写第二章的笔记吧,Ready??GO!     第二章 工作场所中的数据库建模   ......
  • 《数据库设计入门经典》之前言
       首先,先介绍一下这本书的作者与一些这本书的基本内容吧。。。   《数据库设计入门经典》作者:GavinPowell(美)                                              译者:沈吉王洪波赵恒                  ......
  • 《数据库设计入门经典》之第三章笔记
        上一次写了一点第二章的笔记,强调了在做数据库模型的设计时要注意“人”的作用,这一次,来说点正题。第三章的主题目是:数据库建模构件块,看过了以后觉得有些还是在讲数据库的概念性东西,不过,就算是学过了也还是要看一遍,我们总是容易高估自己的记忆,其实很多时候,一些很基础的东西你......
  • 【毕业设计】QT从入门到实战:实现模仿QQ通讯,也是在校的最后一篇博文。
    文章目录一.前言二.模仿QQ通讯1.介绍2.图例一.前言2019年9月来到泰州职业技术学院,从此,正式开启了我的代码求学之路。2021年7月即将离开泰州职业技术学院,还有半个月的时间,从此,将离开校园,变成一个职场人。早上醒来,班主任在群里通知后天要照毕业照,算起来也就不到两年的时间,你可......
  • 2021 ICPC 江西省大学生程序设计竞赛(正式赛)
    链接:https://ac.nowcoder.com/acm/contest/21592BC++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;voidsolve(){intx,y;cin>>x>>y;intcnt=0;vector<int>ans;while(1)......
  • 减法器的设计与实现并用译码器显示16、10进制
    大家新年好,我是呼噜噜,在上一篇简易加法器里我们了解了半加器和全加器的设计与实现,今天我们来看下CPU中减法器是如何实现的。文章比较长,大家可以收藏反复观看计算机为什么利用反码来实现减法?我们来看一个最常见的例子,2-1=1这是减法,但它等同于2+(-1)=1这其实是加法。从运算逻......
  • 设计模式整理
    责任链模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该......
  • 2023年CCPC河南省程序设计竞赛 mjh
    首先,很荣幸有机会参加此次ccpc,虽然成绩很一般。。。这次ccpc一共过了两道签到题。比赛开始就找到了a题,考察字符串的回文判断,通过调用c++库函数过了。第二道签到题类似于数学题。通过类似于找规律的方法,wa了两发过了。看了榜单后决定跟题,大部分时间主要花在f题上,想到排序后在每段......
  • 河南省第十四届icpc大学生程序设计竞赛-clk
    这次比赛赛程比较长,520出发,521,回学校,出发的那一天有点热,感觉不是很好,而且那一天感觉有点生病,应该只是普通感冒,热身赛的时候被oier吊打,省实验真厉害,晚上回酒店后,我喊队友,补了前年的icpc的省赛题,很友好,轻松就A了五道题,用时也不是特别多,还做了情人节的520pta,做的有点慢,导致有一道题没......