目录
开场白
高精度运算的大致思路
开始写代码吧~
高精度加法
1.先来一些开胃小菜
2.接着开始看算法
开场白
说来,这也是一个比较刁钻的问题。也不知道是哪个人,闲的没事干,竟然想到了一个叫做“高精度运算”的东西,让算法又多了一种类型。不过,这是一种非常easy的算法,简称:有手就行的算法。
说了这么多,好像还没有介绍什么是高精度算法呢。所谓高精度算法,其实,就是“加、减、乘、除”这几种普通的运算了。
“不会吧!就是一个简简单单的加减乘除,你就好意思拿上台面来讲?”
客官,您可先甭着急。且听我先把话说完:
“在利用计算机进行数值计算的时候,我们有时会遇到这种问题:有些计算要求的精度高,我们希望计算的位数超过几十位甚至达到几百位,这样我们就不能使用语言自带的数据结构来进行运算了。这个时候,我们就需要用到‘高精度运算’了。”
高精度运算的大致思路
我们应该选用什么类型存储来进行计算呢?
char类型?string类型?
确实,我们可以先用char类型来获取用户的输入。那么,接下来呢?我们不能使用两个字符串进行加减。
或许,可以用链表?或许,可以用结构体来实现这些操作?
这些想法那肯定是更离了个大谱了。其实,我们也是不难想到的——用数组存储。(当然,如果你想出来怎么用链表/结构体来存储的话,可以给我看看,让我长长见识)。我们可以申请一个长度为1024的数组,就已经够我们来使用了。这就解决了存储的问题。
那么,在运算的时候,应该怎么运算呢?
我们不妨想到:运用一个我们小学学过的东西来解决——竖式。
当然,这里头比较复杂的是进位。我们等遇到以后在详细讲解。
开始写代码吧~
高精度加法
高精度加法:输入两个正整数,求它们的和。
1.先来一些开胃小菜
高精度加法:输入两个正整数,求它们的和。
首先,先来无脑的把基本的东西写好。
#include#include #include using namespace std; int main() { return 0; }
接着,弄几个必备的变量和数组。
#include#include #include using namespace std; int main() { char a1[1024], b1[1024];//a1,a2分别存储用户输入的两个数 . int a[1024] = {0}, b[1024] = {0}, add[1024] = {0};//a,b将用户输入的转化为int类型,add为两数相加最后的结果. return 0; }
然后,来接受用户的制裁吧!
#include#include #include using namespace std; int main() { char a1[1024], b1[1024]; int a[1024] = {0}, b[1024] = {0}, add[1024] = {0}; gets(a1); gets(b1); return 0; }
接着,将用户输入的东西放到我们的int类型的数组里头吧!
#include#include #include using namespace std; int main() { char a1[1024], b1[1024]; int a[1024] = {0}, b[1024] = {0}, add[1024] = {0}; gets(a1); gets(b1); for(int i = 0; i <= strlen(a1) - 1; i ++) { a[strlen(a1) - i] = a1[i] - 48; }//将加数放到a数组 for(int i = 0; i <= strlen(b1) - 1; i ++) { b[strlen(b1) - i] = b1[i] - 48; }//将加数放到b数组 return 0; }
稍微解释一下这里。for循环的边界设定,主要是为了不出现数组越界/存储浪费的情况。细细思考,我们这里的存放是倒着存的。这里就和我们的竖式有关系了。由于进位的关系,所以倒着存更加方便一些。而至于为什么要-48,这个问题更加简单,就是单纯的一个ASCLL码的转换罢了。
2.接着开始看算法
此算法极为简单,我们只需要看一下成品的注释就可了解:
#include#include #include using namespace std; int main() { char a1[1024], b1[1024]; int a[1024] = {0}, b[1024] = {0}, add[1024] = {0}; gets(a1); gets(b1); for(int i = 0; i <= strlen(a1) - 1; i ++) { a[strlen(a1) - i] = a1[i] - 48; } for(int i = 0; i <= strlen(b1) - 1; i ++) { b[strlen(b1) - i] = b1[i] - 48; } int i = 1, x = 0;//i表示正在计算第几位,x表示进位的数字 while( (i <= strlen(a1)) || (i <= strlen(b1)) ) { add[i] = a[i] + b[i] + x;//两数相加,并加上上一次的进位 x = add[i] / 10;//向高位进位 add[i] %= 10;//将第i为转换为个位数字 i ++;//到下一位 } add[lenc] = x;//存储个位数 return 0; }
这样,我们的算法就基本上完成了。我们只需要再处理一下善后,并输出就可以了。
#include#include #include using namespace std; int main() { char a1[1024], b1[1024]; int a[1024] = {0}, b[1024] = {0}, add[1024] = {0}; gets(a1); gets(b1); for(int i = 0; i <= strlen(a1) - 1; i ++) { a[strlen(a1) - i] = a1[i] - 48; } for(int i = 0; i <= strlen(b1) - 1; i ++) { b[strlen(b1) - i] = b1[i] - 48; } int lenc = 1, x = 0; while( (lenc <= strlen(a1)) || (lenc <= strlen(b1)) ) { add[lenc] = a[lenc] + b[lenc] + x; x = add[lenc] / 10; add[lenc] %= 10; lenc ++; } add[lenc] = x; if(add[lenc] == 0) //说明个位数没有余数 { lenc --;//不要最后一位了,因为多余 } for(int i = lenc; i > 0; i --)//倒序输出 { cout<
高精度加法,顺利完成!
祝大家五一小长假快乐!
The end



