C++中超长整型类型的构造与实现(附源码)

您所在的位置:网站首页 cvl怎么读 C++中超长整型类型的构造与实现(附源码)

C++中超长整型类型的构造与实现(附源码)

2023-06-12 14:19| 来源: 网络整理| 查看: 265

在曾经的一次面试经历中,被问到这样的问题:如何处理长度有几十位甚至上百位整型数字的加减法?

这是个很有意思的问题,当时我并没能给出令人满意的答案,但这个问题一直围绕在我的脑海,至今,我想把它实现一下。其实这个问题的难度已经被有意的缩减了,因为这里只说到加减法,如果要用到乘除法,那可能会更为麻烦一点,这是其一。其二,没有涉及小数位。那么下面我们就先来实现超长整型的加减法吧。

(注:在写本篇学习笔记时,本人学习和参考了网络文章,并做了借鉴,感谢各位前辈的分享。如果本文对您有所帮助,您可以随意分享,如果发现文中有误,也请指教,谢谢。本文用到的调试工具:Microsoft Visual Studio 10,操作系统:Windows 7)

在进行加减法运算的时候,首先判断两个操作数的符号位,若为同号,则用加法,若为异号,则用减法。

为了满足基本类型中从个位开始相加的方法,首先将两个超长整型中的m_strData中的字符串反转,从字符串的第一位开始相加,最后又将结果反转还原。比如对于操作数“723456”+“76912”,首先反转为“654327”+“21967”,再从字符串的第一位相加,并且向右进位,得到结果为“863008”,最后反转还原为“800368”。

综上所述,我们需要的数据成员有:符号位、数据长度、数值。

需要用到的方法有:加法函数、减法函数、字符串反转函数,还需要重载“+”、“-”,还可以重载输入输出流“”。

最后再加上一些需要用到的其他方法,头文件VeryLong.h的定义如下:

#pragma once #include #include #include using namespace std; #define NUM_LEN 1000 class CVeryLong { public: CVeryLong(void); CVeryLong(const char * sData); CVeryLong(const CVeryLong &other); ~CVeryLong(void); int getLen(); int getSign(); char * getData(); void setData(const char * sData); static int bigNum(const int a, const int b);/* 比较a、b大小 */ static void plus(CVeryLong &cvl, CVeryLong &c1, CVeryLong &c2); static void sub(CVeryLong &cvl, CVeryLong &c1, CVeryLong &c2); friend CVeryLong operator+(CVeryLong &c1, CVeryLong &c2); friend CVeryLong operator-(CVeryLong &c1, CVeryLong &c2); friend istream &operator>>(istream &in, CVeryLong &c); friend ostream &operator 0) { CVeryLong::sub(cvl,c2,c1); } else { cvl.setData("0"); } } } return cvl; } 如开篇所说,在加减法运算过程中,我们可以先把操作数中的字符串反转,然后从第一位开始做加减运算,并且向右进位或者借位。在两个字符进行加减运算的时候,我们可以运用字符可自动转换成ASCII码直接进行加减,并且赋值给一个整形变量即可,当然我们知道0~9的ASCII码表对应的是48~57,所以要对操作数进行处理之后再做加减。

函数plus()的实现如下:

void CVeryLong::plus(CVeryLong &cvl, CVeryLong &c1, CVeryLong &c2) { int i=0; int j=0; int ver=0; char ch='0'; char ch0='0'; char ch1='\0'; char ch2='\0'; char str[NUM_LEN]={0}; c1.reversalStr(); c2.reversalStr(); j=CVeryLong::bigNum(c1.getLen(),c2.getLen()); for(i=0;(i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3