当前位置: 首页 > news >正文

迅腾网络网站建设有限公司职业培训网

迅腾网络网站建设有限公司,职业培训网,网站查询域名访问,合肥微信网站目录 1. 基础知识 2. 大整数 大整数 3. 大整数 - 大整数 1. 基础知识 利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了&#xff0c…

目录

1. 基础知识

2. 大整数 + 大整数

3. 大整数 - 大整数


1. 基础知识

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。

这里我们要介绍:大整数 + 大整数,大整数 - 大整数,大整数 * 小整数,大整数 / 小整数。

大整数显然用简单的数据类型是无法表示的。所以我们选用数组来存储大整数的每一位。于是,就产生了这么一个问题:数组下标为0的元素是存最高位还是最低位呢?

显然,我们在运算过程中可能会发生进位,这时,如果我们用第一种(下标为0存最高位),在运算过程中最高位发生进位时,就需要在数组的前面添加一个新的位置来存放产生的进位。这就需要将数组的元素整体向后移动,这很麻烦。所以我们选用第二种方式来存储大整数(下标为0存最低位),这样在产生进位时我们只需要在数组的后面添加一个位置即可。这是非常容易滴。

2. 大整数 + 大整数

我们可以从人类计算加法的方法中找出做加法的规律:

下面以 345678 + 6789 距离分析:我们将存储进位的变量 carry 初始化为0,然后让 carry 去与两个大整数的个位相加,即 0 + 8 + 9 = 17,将得到的结果 17 对 10 取模,得到相加后的个位:7,push_back到存放结果的数组,然后继续将相加后的结果17除以10,作为下一位相加的进位。依次类推,直到将两个大整数的每一位相加。

#include<iostream>
#include<vector>
using namespace std;//传引用可以提高效率,不用copy一遍数组了
vector<int> add(vector<int>& A, vector<int>& B)
{//存放结果的数组vector<int> C;//用来记录进位的变量,初始化为0int carry = 0;//对两个大整数的对应位置的数相加for (int i = 0; i < A.size() || i < B.size(); i++){//因为两个大整数的长度可能有差异,当一个大整数的每一位加完了,就不需要继续了if (i < A.size())carry += A[i];if (i < B.size())carry += B[i];C.push_back(carry % 10);carry /= 10;}//如果最高位相加有进位(只可能是1,push_back 1 也行),再将进位push_backif (carry){C.push_back(carry);}return C;}void test01()
{//两个大整数以字符串的形式输入string a, b;cout << "请输入两个整数,以回车键结束" << endl;cin >> a >> b;//两个数组用来存放大整数的每一位vector<int> A, B;//将输入的大整数的每一位拆分后添加到数组//数字字符 - '0' 即可得到数字字符对应的数字for (int i = a.size() - 1; i >= 0; i--){A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--){B.push_back(b[i] - '0');}//用一下大整数加法的接口,并且用C接收最终结果vector<int>C = add(A, B);cout << "相加的结果:";//输出结果for (int i = C.size() - 1; i >= 0; i--){printf("%d", C[i]);}cout << endl;
}int main()
{//大整数的加法test01();system("pause");return 0;
}

3. 大整数 - 大整数

大整数减去大整数用户可能输入的是一个较小的大整数减去一个较大的大整数,我们就需要先进行一个比较,确保我们在做减法时是大的数减去小的数,如果需要在最终的结果上加上负号即可。

与大整数加大整数类似,对两个大整数的每一位做减法,显然这时有两种情况:当减数小于被减数,此时就需要向前借一位,而当减数大于等于被减数则不需要进位。

 这里还有一个问题就是:相减的结果在打印时可能会有先导0,例如:12345 - 12300 在没有去掉先导0,得到的结果就是:00045,这显然不是我们想要的。我们需要对存放结果的数组的最后一个元素进行判断,如果该元素为0,就需要将其pop掉。但是如果相减的最终结果是0,这样做存放结果的数组里面将没有元素了,所以我们需要保证存放结果的数组中至少有一个元素。

bool cmp(vector<int>& A, vector<int>& B)
{//先比较两整数的长度if (A.size() != B.size()){return A.size() - B.size();}//从最高位开始比较for (int i = A.size() - 1; i >= 0; i--){if (A[i] != B[i])return A[i] > B[i];}//这里代表两个数相等return true;
}vector<int> sub(vector<int>& A, vector<int>& B)
{vector<int> C;int borrow = 0;for (int i = 0; i < A.size(); i++){//减数减去借位borrow = A[i] - borrow;//当i不小于被减数的大小就不用做减法了if (i < B.size())borrow -= B[i];//利用一般规律push_back结果C.push_back((borrow + 10) % 10);//有借位borrow置为1if (borrow < 0)borrow = 1;elseborrow = 0;}//去掉先导0while (C.size() > 1 && C.back() == 0){C.pop_back();}return C;
}void test02()
{//两个大整数以字符串的形式输入string a, b;cout << "请输入两个整数,以回车键结束" << endl;cin >> a >> b;//两个数组用来存放大整数的每一位vector<int> A, B;//将输入的大整数的每一位拆分后添加到数组//数字字符 - '0' 即可得到数字字符对应的数字for (int i = a.size() - 1; i >= 0; i--){A.push_back(a[i] - '0');}for (int i = b.size() - 1; i >= 0; i--){B.push_back(b[i] - '0');}//对两个大整数做判断,确保是大数 - 小数if (cmp(A, B)){//用一下大整数加法的接口,并且用C接收最终结果vector<int>C = sub(A, B);cout << "相减的结果:";//输出结果for (int i = C.size() - 1; i >= 0; i--){printf("%d", C[i]);}cout << endl;}else{//用一下大整数加法的接口,并且用C接收最终结果//如果B > A,交换位置传参即可,最后输出数据的时候加上负号vector<int>C = sub(B, A);cout << "相减的结果:";//输出结果cout << "-";for (int i = C.size() - 1; i >= 0; i--){printf("%d", C[i]);}cout << endl;}}int main()
{//大整数的减法test02();system("pause");return 0;
}
http://www.shuangfujiaoyu.com/news/20263.html

相关文章:

  • 网站制作器手机版下载中国第三波疫情将在9月份
  • 做服装的一般去什么网站找图片南京seo排名优化
  • 网站建设项目的网络图免费的h5制作网站
  • 山西大同专业网站建设价格宁波优化网站排名软件
  • 温州平阳县网站建设兼职千万别在百度上搜别人名字
  • 苏州网站建设布局自媒体怎么赚钱
  • 惠州专业做网站互联网营销师考证多少钱
  • 平面设计发展前景杭州seo俱乐部
  • 企业网站主页模版北京网上推广
  • jsp网站开发的参考文献西安小程序开发的公司
  • java主要就是做网站吗百度指数的网址是什么
  • 设计的好网站国外网站推广平台有哪些
  • 建设银行租房网站网络公司网络推广
  • 做服务网站网站优化要多少钱
  • 举报非法网站要求做笔录深企在线
  • 网站 缓存什么时候使用网络营销策略分析案例
  • 济南建设工程业绩公示的网站seo属于运营还是技术
  • 内蒙古呼和浩特市做网站的公司seo搜索优化 指数
  • 校园网站的系统建设网页浏览器
  • 中国佛山营销网站建设灰色词seo排名
  • 网站备案收费标准在百度上怎么发布广告
  • espcms易思企业网站系统nba今日最新消息
  • 视频网站建设 方案重庆森林经典台词
  • 长沙疫情最新消息今天湖南疫优化的意思
  • 怎么找做企业网站的seo免费诊断联系方式
  • 网站源码 源码论坛 源码之家 免费源码 商业源码 源码下载全渠道营销
  • 网站左侧分类菜单怎么做市场监督管理局电话
  • 茶的网站制作遵义网站seo
  • 网站文章内链哪里有学市场营销培训班
  • 西安网站网络营销唐山seo快速排名