参加MOOC PKU的程序设计专项课程学习,目前进度到C++。这门课太烂了,完全就是自学,作业还相当难!!!!比如这里week4的这题,其实是把poj上的大整数的加、减、乘、除合并到一题里面,这个代码量很恐怖。当然了,通过查找相关资料,终于学习了,如何实现大整数的高精度四则运算,这也是程序员面试的一道经典题。其实具体的思路就是小学竖式计算,但是代码实现的过程,比较抽象。先说说大整数加法。
0、编写大整数类结构
使用数组存储所有操作数,定义数组大小200。定义一个全局变量,存运算符,因为减法运算中有可能需要输出负号。定义一个布尔变量,用于区分减法的三种情况。
#include <iostream>
#include<cstring>
#include<cstdlib>
#define MAX_LEN 200
char o; /*全局运算符*/
bool cannotSub=0; /*不够减标记,区分减法的情况*/
char szLine1[MAX_LEN+10]={0}; /*输入输出的字符数组*/
char szLine2[MAX_LEN+10]={0};
成员变量2个。一个是数组的首地址,用整型指针。另一个是存储数组的大小,用int型。
成员函数包括构造函数、赋值号重载函数以及四则运算符号的重载函数和一个倍增函数(用于将数扩大为原来的10n倍)。
class bigNum
{
public:
bigNum():sInt(NULL){ len=0; } /*构造函数*/
~bigNum(){ if(sInt) delete[] sInt; }/*析构函数*/
const int * getint(){ return sInt; } /*返回数组首地址*/
bigNum & operator= (char *s); /*赋值号重载函数*/
bigNum & operator= (bigNum & b); /*实现深复制,即指向内容之间的复制*/
friend void operator+ (bigNum & result,bigNum & b);/*加号重载*/
friend void operator- (bigNum & result,bigNum & b);/*减号重载*/
friend void operator* (bigNum & result,bigNum & b);/*乘号重载*/
friend void operator/ (bigNum & result,bigNum & b);/*除号重载*/
friend void multi10 (bigNum & b,int n);/*倍增函数*/
private:
int *sInt; /*实际进行四则运算的整型数*/
int len; /*数组长度*/
};
赋值号重载函数的作用,
- 1、是实现主函数中字符串存储为整型数组,因为用主函数中定义了char型数组cin输入的是ASCII码,需要减去’0’的ASCII码再存储为整型数组。输入用字符数组,因为有一些函数可以直接使用,如求字符串长度等等。
- 2、是实现对象之间的深复制,也就是对象所指向内容之间的拷贝。
- 3、是实现动态分配数组的存储空间。
一、大整数加法
1、思路
大整数加法的思路,就是竖式计算,逐项相加。考虑进位,就是逢十进一,也就是说如果某一位大于等于10,减去10就是本位和,然后下一位++,这就是进位。加法最多就是进1位。
2种情况.不进位加法:
1234
+4321
5555
进位加法
999
+888
887
2、 算法
运用数组存储两个加数,右对齐逐位相加,如果和大于或等于10,和减10,同时下一位被加数++。
/*加号重载,实现result+b*/
void operator+ (bigNum & result,bigNum & b)
{
for( int i = 0;i < MAX_LEN+10 ; i ++ )
{
result.sInt[i] += b.sInt[i]; //逐位相加
if( result.sInt[i] >= 10 )
{ //看是否要进位
result.sInt[i] -= 10; //本位和
result.sInt[i+1] ++; //下一位进位
}
}
}