高精度算法整理
2020-04-05 18:24
85 查看
洛谷p1601
高精度加法
#include<iostream>//用字符串类处理长数 #include<string> using namespace std; string add(string str1,string str2){ string str; int len1=str1.length(),len2=str2.length(); if(len1<len2){ for(int i=1;i<=len2-len1;i++) str1="0"+str1;//让两个数一样长,两数对齐 } else{ for(int i=1;i<=len1-len2;i++) str2="0"+str2; } len1=str1.length(); int cf=0,temp; for(int i=len1-1;i>=0;i--){ //从低位开始运算 temp=str1[i]-'0'+str2[i]-'0'+cf; cf=temp/10;//cf为进位 temp%=10; str=char(temp+'0')+str; } if(cf!=0) str=char(cf+'0')+str;//进位不为零 return str; } int main(){ string str1,str2; cin>>str1>>str2; cout<<add(str1,str2)<<endl; return 0; }//缺陷是不能进行负数相加
这是直接对字符串进行的处理,还可用数组。
#include<iostream> #include<string> using namespace std; #define maxn 1050 string a,b; int na[maxn],nb[maxn],ans[maxn]; int main(){ cin>>a>>b; for(int i=a.size();i>0;i--) na[i]=a[a.size()-i]-'0'; for(int i=b.size();i>0;i--) nb[i]=b[b.size()-i]-'0'; int max1=max(a.size(),b.size()); for(int i=1;i<=max1;i++){ if(na[i]+nb[i]>=10){ na[i+1]++; ans[i]=na[i]+nb[i]-10; } else ans[i]=na[i]+nb[i]; } if(na[max1+1]!=0) cout<<na[max1+1]; for(int i=max1;i>0;i--) cout<<ans[i]; return 0; }
还有一个从大佬那学来的超级方法,可以处理负数
高精度减法
#include<bits/stdc++.h #define MAXN 10500 using namespace std; string a, b; string _add(string a, string b)//高精度相加 (为底下a或b为负数相减做铺垫)这个都会吧。 { string sum; int na[MAXN] = {0}, nb[MAXN] = {0}, ans[MAXN + 1] = {0}; for(int i = a.size(); i > 0; i --)na[i] = a[a.size() - i] - '0'; for(int i = b.size(); i > 0; i --)nb[i] = b[b.size() - i] - '0'; int maxl = max(a.size(), b.size()); for(int i = 1; i <= maxl; i ++) { ans[i + 1] = (ans[i] + na[i] + nb[i]) / 10; ans[i] = (ans[i] + na[i] + nb[i]) % 10; }//相加 if(ans[maxl + 1] != 0)sum += "1";//特判 防止最大位进位 for(int i = maxl;i > 0; i --)sum += ans[i]+'0'; return sum; } string _minus(string a, string b) { int na[MAXN] = {0}, nb[MAXN] = {0}, ans[MAXN] = {0}; string diff; if((a < b && a.size() <= b.size()) || b.size() > a.size()) return "-" + _minus(b, a); for(int i = a.size(); i > 0; i --)na[i] = a[a.size() - i] - '0'; for(int i = b.size(); i > 0; i --)nb[i] = b[b.size() - i] - '0'; int maxl = max(a.size(), b.size()); for(int i = 1; i <= maxl; i ++) { if(na[i] < nb[i]) { na[i + 1] --; na[i] += 10; } ans[i] = na[i] - nb[i]; } while(ans[maxl] == 0)maxl --;//防止减后降位,多输出若干0 if(maxl < 1)return "0"; for(int i = maxl; i > 0; i --)diff += ans[i] + '0';//数组转化为字符串。 return diff; } int main() { string a,b; cin >> a >> b; if(a[0] == '-' && b[0] == '-') //当两个数字为负数 { a.erase(0, 1); b.erase(0, 1);//擦掉a,b打头的负号再运算,下同 cout << _minus(b,a); //-a-(-b)=-a+b=b-a return 0; } else if(a[0] == '-') //只有a为负数 { a.erase(0, 1); cout << "-" << _add(a, b); //-a-b=-(a+b) return 0; } else if(b[0] == '-') //只有b为负数 { b.erase(0, 1); cout << _add(a, b); //a-(-b)=a+b return 0; } else cout << _minus(a, b); return 0; }
高精度乘法
#include<iostream> #include<string> using namespace std; #define maxn 10050 int na[maxn],nb[maxn],c[maxn]; int main(){ string a,b; cin>>a>>b; for(int i=a.size();i>0;i--) na[i]=a[a.size()-i]-'0'; for(int i=b.size();i>0;i--) nb[i]=b[b.size()-i]-'0'; for(int i=1;i<=a.size();i++) { for(int j=1;j<=b.size();j++) c[i+j-1]+=na[i]*nb[j]; } int len=a.size()+b.size(); for(int i=1;i<len;i++) if(c[i]>9){c[i+1]+=c[i]/10;c[i]=c[i]%10;} while(c[len]==0&&len>1) len--; for(int i=len;i>0;i--) cout<<c[i]; return 0; }
高精度除法暂时还不会。。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 整理的高精度算法
- Android源码编译整理总结
- 常用的JQuery数字类型验证正则表达式整理
- 排序算法整理
- 关于android的零碎问题的整理
- 转: 一个程序员的Java和C++学习之路(整理)
- Qt笔记整理
- (1-2)章深入.NET平台和C#编程 复习的时候 整理的笔记
- 常用API类整理
- (轉貼) 大年三十整理的asp.net资料! (.NET) (ASP.NET)
- 装箱和拆箱【整理】
- !!声明:为了方便自己整理和助教检查,因此在最近几天将统一修改部分博客标题重新上传,或对内容做一定调整后再上传一次,以前的博客将删除部分!!
- Deep Learning with PyTorch: A 60 Minute Blitz 要点整理
- js常用代码段整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)10_使用栈完成高级计算器(2)_学习笔记_源代码图解_PPT文档整理
- 关于oracle使用到的函数整理
- 黑马程序员——Objective-C语言知识整理——类方法与对象方法
- Drop and Drag API学习与整理
- Appium+java移动端项目测试问题整理
- struts2拦截器_动力节点Java学院整理