栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++之数据结构与算法1:高精度计算-加法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++之数据结构与算法1:高精度计算-加法

目录

开场白

高精度运算的大致思路

开始写代码吧~

高精度加法

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846743.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号