首页 > 其他分享 >第十六天第一个问题

第十六天第一个问题

时间:2023-05-08 10:36:50浏览次数:41  
标签:第十六 char BigNum 第一个 int s2 问题 len1 num

问题描述:

6-3 【CPP0024】设计并实现大数类BigNum 分数 10 作者 C++多态编程 单位 石家庄铁道大学

定义一个整数型大数类,要求能够完成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;
}
}

标签:第十六,char,BigNum,第一个,int,s2,问题,len1,num
From: https://www.cnblogs.com/czfznb/p/17380934.html

相关文章

  • 解决mysql出现docker出现access denied for user root@% to database“xxx”的问题
    使用navicat连接Linux上的数据库时,新建一个库出现异常无法创建accessdeniedforuserroot@%todatabase返回Linux查看mysql状态状态正常,navicat也能正常连接,排除掉应该是权限的问题dockerexec-itd7bcc087dce1bash进入mysql容器 mysql-uroot-p登录账......
  • 解决DR5在Photoshop里未经签署的问题
    下了个dr5插件,整半天安装后未经签署。。。解决办法:win+R打开cmd输入regedit打开注册表编辑器,找到HKEY_CURRENT_USER\SOFTWARE\Adobe下的 这几个文件,查看有没有下面这个:要保证每个文件下都有,没有的就自己手动新建字符串命名为PlayerDebugMode,然后数值设置为1就行。终于可以......
  • Axure 9的中继器排序问题
    问题如图所示,有一个下拉列表,可按价格排序、销量排序、综合排序,具体事件交互已经在Axure9中制作完毕,并且,逻辑已经检查无误了,但是呢,在浏览器预览,选择条件排序时,却始终无法使得数据变动排序解决可能有如下原因:所需要排序的条件可能存在非数值(如,中文什么的),将数据修正即可......
  • K8S:分享一次“乌龙问题”(人为导致的无法正常删除命名空间)
    问题背景背景是这样的,我有一套测试用的K8S集群,发现无法正常删除命名空间了,一直处于Terminating状态,强制删除也不行。于是,再次手动创建了一个名为“test-b”的命名空间,同样也是不能正常删除。于是,展开了排查。不过,查到最后,发现是个毫无技术含量的“乌龙问题”。结果不重要,重要的......
  • 二分查找——出现溢出问题
    算法描述:前提:有已排序数组A(假设已经做好)定义左边界L、右边界R,确定搜索范围,循环执行二分查找(3、4两步)获取中间索引M=Floor((L+R)/2)中间索引的值A[M]与待搜索的值T进行比较①A[M]==T表示找到,返回中间索引②A[M]>T,中间值右侧的其它元素都大于T,无需......
  • Mac睡眠时经常异常唤醒问题的处理
    源引自:https://wo.zhaoxin.pro/16682846375746.html问题最近从英特尔芯片的iMac5K,换成了苹果芯片的Macmini。一切都好,就是电脑在睡眠之后,经常会异常唤醒。表现为显示器由黑转亮,同时显示为无信号;键盘背景灯变亮;外置机械硬盘启动,发出噪音。然后几秒后,电脑又睡眠了。这个过程在......
  • 【算法基础】DFS深度优先算法 —— AcWing 843. n-皇后问题 AcWing 842. 排列数字
    n-皇后问题是一个经典的dfs深度优先遍历的题目,在题解这一题之前,将由浅入深,先讲解一个n-皇后问题的母题。-------AcWing842.排列数字 [AcWing842].排列数字题目概述给定一个整数 n,将数字 1∼n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格......
  • 复旦大学高等代数三件套及其常见问题的回答
    复旦大学高等代数三件套(1)复旦大学高等代数教材介绍(使用本教材的高校列表会更新)https://www.cnblogs.com/torsor/p/16843108.html(2)复旦大学高等代数白皮书第四版介绍https://www.cnblogs.com/torsor/p/16840476.html(3)复旦大学高等代数习题集(每年9月初会更新版本及其下载地址)......
  • java常见问题
    java.lang.OutOfMemoryError:Javaheapspace 解决问题之前先来分析一下为什么会出现内存溢出的问题.有两种可能性:一种是应用有问题,本该回收的内存没有进行回收导致的内存溢出,这种情况就需要修改代码了.第二种情况则是服务器资源不够或JVM参数设置过小导致的内存溢出,......
  • 遇到的问题:nacos配置管理,无法获取到nacos中的配置内容
    nacos中的配置: bootstrap.yml文件:    1spring:2application:3name:userservice4profiles:5active:dev#环境6cloud:7nacos:8server-addr:localhost:8848#nacos地址9config:10file-extensio......