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

莆田建设信息网站微信小程序费用有哪些

莆田建设信息网站,微信小程序费用有哪些,wordpress仿蛙壳网主题,专门做国外家具书籍的网站高精度前言 C中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。 高精度总体思路 由于int和long long的限制,我们要想存放很长的数就需…

高精度前言

C++中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。

高精度总体思路

由于int和long long的限制,我们要想存放很长的数就需要利用数组存储,C++中可以利用STL中的vector容器存储

读取: 由于数据很大,用int存放不下,一般利用字符串读取

数据存放:用vector倒序存储,即将小位放到前面,将大位放到后面,这样方便数据处理

高精度算法

高精度加法

示例题目:

我们一般习惯是加法从个位数开始运算, t表示进位,初始t为0。先将个位数相加,图中为6+5=11

在加法中11%10 = 1为个位,11/10=1为进位,即t = 1,所以十位数相加为2+4+1=7,如此往复。根据此思路即可写出代码

//高精度加法
#include<iostream>
using namespace std;
#include<vector>vector<int> add(vector<int> A,vector<int> B)
{//进位t初始为0int t = 0;vector<int> C;//i到任意一方结尾停止for(int i = 0;i<A.size() || i< B.size();i++){if(i<A.size() ) t+=A[i];if(i< B.size()) t+=B[i];//相加后如果大于10要取余作为个位,如果小于10不影响C.push_back(t%10);//算进位t = t/10;}//最后一次计算 如果t为1 要在最高位补1if(t) C.push_back(t);return C;
}int main()
{vector<int> A,B;//利用字符串读取string a,b;cin>>a>>b;//将高位存放在后面,低位存放的前面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');//auto为自动判断类型,会自动判断函数的返回类型auto C = add(A,B);for(int i = C.size()-1;i>=0;i--) cout<<C[i];
}

其中a[i]-'0'是将字符类型的数字转换为整型类型的数字

需要注意的是这段代码

if(t) C.push_back(t);

这为了解决50+50 = 100类似的情况,最后一次计算后如果t=1,则需要在最高位补1。

高精度减法

示例题目: 

减法计算思路与加法相似

此时t表示的是借位,总体计算公式为 a[i]-b[i]-借位。

借位的计算

如果这次的A[i]-B[i] >= 0则下次的借位为0,反之下次计算的借位为1。

解决了计算的问题,减法还有负数的问题,如果小数减去大数要为负数,所以我们需要自己写一个判断两数大小的函数

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;
}

先比较两数的位数,再依次比较两数的每一位,到最后还未得出结果,则返回true表示两数相等

在输出时分类讨论,负数先输出负号在输出数据即可

完整代码

//高精度减法模板
#include<iostream>
using namespace std;
#include<vector>
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;for(int i=0,t=0;i<A.size();i++){t = A[i] -t;if(i<B.size()) t-=B[i];C.push_back((t+10)%10);if(t<0) t=1;else t=0;}//去除前导0while(C.size()>1 && C.back() ==0  ) C.pop_back();return C;
}int main()
{string a,b;vector<int> A,B;cin>>a>>b;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)){auto C = sub(A,B);for(int i = C.size()-1;i>=0;i--) cout<<C[i];}//负数else{auto C = sub(B,A);cout<<"-";for(int i = C.size()-1;i>=0;i--) cout<<C[i];}return 0;
}

在题目中可能会出现需要去除前导0的情况

例如输出023,这个0没有实际意义,需要去除,被称为前导0

利用下面这段代码即可去除前导0

while(C.size()>1 && C.back() ==0  ) C.pop_back();

高精度乘法

示例题目:

高精度乘法一般只考虑大数乘以小数

与加法十分类似,所以具体思路参考加法,需要注意的是,乘法也需要去前导0.

#include<iostream>
using namespace std;
#include<vector>vector<int> mul(vector<int> A,int b)
{vector<int> C;int t = 0;for(int i = 0;i<A.size();i++) {if(i<A.size()) t += A[i]*b;C.push_back(t%10);t = t/10;}while(C.size() >1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a;int b;vector<int> A;cin>>a>>b;for(int i = a.size()-1;i>=0;i--) A.push_back(a[i]-'0');auto C = mul(A,b);for(int i = C.size()-1;i>=0;i--) cout<<C[i];return 0;
}

高精度除法

实例题目

高精度除法需要注意的是余数,并且与加减乘法不同的是,除法是从高位开始计算的,而加减乘法是从低位开始计算的,需要加以区别

模拟除法过程我们可以发现,每次的被除数是上次计算得到的余数r*10加上a[i],在图中为

1*10+5=15,我们将r/b入数组即可。

完整代码

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>vector<int> div(vector<int>& A,int b,int& r)//r传入r的地址,便于直接对余数r进行修改
{r = 0;vector<int> C;for(int i = A.size()-1;i>=0;i--)//对A从最高位开始处理{r = r*10+A[i];//对A从最高位开始处理C.push_back(r/b);//将上次的余数*10在加上当前位的数字,便是该位需要除的被除数r = r%b;//余数}//由于在除法运算中,高位到低位运算,因此C的前导零都在vector的前面而不是尾部,vector只有删除最后一个数字pop_back是常数复杂度,而对于删除第一位没有相应的库函数可以使用,而且删除第一位,其余位也要前移,//因此我们将C翻转,这样0就位于数组尾部,可以使用pop函数删除前导0reverse(C.begin(),C.end());while(C.size()>1 && C.back() ==0 ) C.pop_back();return C;
}
int main()
{string a;int b;cin>>a>>b;vector<int> A;for(int i =a.size()-1;i>=0;i--) A.push_back(a[i]-'0');int r;auto C = div(A,b,r);for(int i = C.size()-1;i>=0;i--) cout<<C[i];cout<<endl<<r<<endl;
}

高精度除法同样需要去除前导0,不过不同的是,由于在除法运算中,高位到低位运算,因此C的前导零都在vector的前面而不是尾部,vector只有删除最后一个数字pop_back是常数复杂度,而对于删除第一位没有相应的库函数可以使用,而且删除第一位,其余位也要前移,因此我们可以利用reverse()函数将C翻转,这样0就位于数组尾部,可以使用pop函数删除前导0

此篇为学习之余的总结,作为笔记使用,如果有错误还请指正,谢谢!

http://www.dtcms.com/a/397836.html

相关文章:

  • 针织东莞网站建设技术支持做视频网站的技能
  • 为何网站建设公司报价不同买布自己做网站衣服的
  • 关于美食的网站设计网站管理员权限
  • 瑞安做网站多少钱seo资讯
  • 网站建设后台管理便捷邵阳市中高风险地区
  • 郑州企业网站优化哪家便宜seo培训教程
  • 怎样做品牌推广南宁网站建设_seo优化服务公司
  • 百度收录批量查询工具长春网站优化教程
  • 东营高端网站建设萌新seo
  • 佛山网站建设电话wordpress顶部两边有富余
  • 纯静态企业网站南京服务好建设网站哪家好
  • 有什么可以在线做数学题的网站龙岗网站制作公司一般多少钱
  • 自己做的影视会员网站违法么用html做网站的背景图怎么弄
  • 商城站在哪个地方wordpress上传大附件
  • 做网站线上线下价格混乱企业网站备案网地址
  • 太原网站搜索排名玉林做网站优化推广
  • 长沙建站模板平台网贷代理推广
  • 免费网站模网游网站开发
  • 江苏建设监理协会官方网站logo设计 效果图
  • 百色高端网站建设西昌手机网
  • 南京建设部执业注册中心网站id注册网站
  • 网站建设的岗位是什么岗位wordpress主题怎么选
  • 佛山外贸网站阜城网站建设价格
  • 制作网站多少钱一个网站开发word文档
  • 网站建设与设计实习报告如何在网站中做公示信息
  • 建设网站要做的工作总结企业网站系统官网
  • 网站建设宣传软文范例私密浏览器免费观看
  • 简约大气网站首页网站首页seo关键词布局
  • 青岛经纬建设工程有限公司网站网站优化排名方法
  • 昆明网站开发推广Wordpress主题 修改 价钱