高精度减&&除法
2015-07-26 16:02
351 查看
高精度减法
/*与加法差不多,逆序相减,但要把高位的零去掉*/
代码如下:
高精度除法
/*虽然实质就是减法,但注意点较多,具体看注释*/
/*与加法差不多,逆序相减,但要把高位的零去掉*/
代码如下:
#include<iostream> #include<cstring> #define maxn 1000000+10 using namespace std; int na[maxn],nb[maxn],nc[maxn]; char a[maxn],b[maxn]; void sub() { int lena,lenb; memset(na,0,sizeof(na)); memset(nb,0,sizeof(nb)); lena=strlen(a),lenb=strlen(b); for(int i=0;i<lena;i++) na[i]=a[lena-i-1]-'0'; for(int i=0;i<lenb;i++) nb[i]=b[lenb-i-1]-'0'; int max=lena>=lenb?lena:lenb; //if(max==lenb) return; for(int i=0;i<max;i++) { na[i]-=nb[i]; if(na[i]<0) na[i]+=10,na[i+1]--; } while(!na[max-1]&&max>0) max--; if(!max) max++; for(int i=0;i<max;i++) a[i]=na[max-i-1]+'0'; a[max]='\0'; } int main() { while(cin>>a>>b) { sub(); cout<<a<<endl; } }
高精度除法
/*虽然实质就是减法,但注意点较多,具体看注释*/
#include<iostream> #include<cstring> #define maxn 200+10 using namespace std; int na[maxn],nb[maxn],nc[maxn]; char a[maxn],b[maxn]; int sub(int *pna,int *pnb,int lena,int lenb) { if(lena<lenb) return -1; if(lena==lenb) { bool flag=false;//判断位数一样时两数大小 for(int i=lena-1;i>=0;i--) { if(pna[i]>pnb[i]) flag=true; else if(pna[i]<pnb[i]) if(!flag) return -1; } } for(int i=0;i<lena;i++) { pna[i]-=pnb[i]; if(pna[i]<0) pna[i]+=10,pna[i+1]--; } for(int i=lena-1;i>=0;i--) if(pna[i]) return i+1; return 0; //lena=1且pna[0]=0,也就是被除数与除数相等,返回0 } void div() { int lena=strlen(a),lenb=strlen(b); memset(na,0,sizeof(na)); memset(nb,0,sizeof(nb)); memset(nc,0,sizeof(nc)); if(lena<lenb) { cout<<'0'<<endl; return; } for(int i=0;i<lena;i++) na[i]=a[lena-i-1]-'0'; for(int i=0;i<lenb;i++) nb[i]=b[lenb-i-1]-'0'; lena=sub(na,nb,lena,lenb); if(lena<0) { cout<<'0'<<endl; return ; }else if(lena==0) { cout<<'1'<<endl; return ; } nc[0]++; //被除数减去一次除数,商加一 int len=lena-lenb; //被除数和除数相差位数 if(len<0) goto output; else if(len>0){ for(int i=lena-1;i>=0;i--) //位数不同时,乘上10的倍数使位数相同 { if(i>=len) nb[i]=nb[i-len]; else nb[i]=0; } } lenb=lena; //注意别忘记此时两者位数要相同 for(int i=0;i<=len;i++) { int cnt; while((cnt=sub(na,nb+i,lena,lenb-i))>=0) //被除数减去与自己位数相同直到除数位数与原来相同 { lena=cnt; nc[len-i]++; //商最多的位数为被除数的位数减去除数的位数加一 } } output: for(int i=0;i<len;i++) nc[i+1]+=nc[i]/10,nc[i]%=10; //处理进位 int max=maxn-1; //注意数组最大下标为maxn-1 while(!nc[max]&&max>0) max--; for(int i=max;i>=0;i--) cout<<nc[i]; cout<<endl; } int main() { while(cin>>a>>b) { div(); } return 0; }
相关文章推荐
- 48. Rotate Image
- iOS- 多线程技术的概述及优点
- poj 1088 滑雪(记忆化深搜)
- 坦克大战
- 锁的理解
- Scala集合操作指南
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- 2.3 VMCS
- NOIP提高组2010 乌龟棋
- Android 双卡双待支持检验SIM信息获取
- 2.2 内核VMX基本数据结构与操作
- UVA424 (高精度)
- NOIP提高组2010 乌龟棋
- astah简体中文版本
- LeetCode Letter Combinations of a Phone Number 电话号码组合
- leetcode[116]:Populating Next Right Pointers in Each Node
- 关于 使用post 方法出现headers already sent问题
- JS 解析XML文件
- INT_MAX,INT_MIN,isdigit函数
- 轻松上Google