高精度加法,减法
2018-03-07 23:09
253 查看
高精度运算:
是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。
对于一个高精度正整数,接受与存储的程序段如下:
是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。
对于一个高精度正整数,接受与存储的程序段如下:
输入处理
int na[110]={0},nb[110]={0};//用数组按位存放高精度正整数,初值全为0 int la=a.size(),lb=b.size();//高精度正整数的位数 /***数组从右向左存储,na[0]存放个位,na[1]存放十位...***/ for(int i=0;i<la;i++){ na[la-1-i]=a[i]-'0'; } for(int i=0;i<lb;i++){ nb[lb-1-i]=b[i]-'0'; }
相加
int lmax=la>lb?la:lb;//选取最长长度开始相加 for(int i=0;i<lmax;i++){ na[i]+=nb[i]; //两数相加 na[i+1]+=na[i]/10;//要进的位 na[i]%=10;//进位后的数 } //如果最高位大于10,即na[lmax-1+1]=1;lmax++ if(na[lmax]){ lmax++;//位数加1 }
处理最高进位
例如:当输入为00006 00003时for(int i=lmax-1;i>=0;i--){ if(na[lmax-1]==0) lmax--; }
输出结果
for(int i=lmax-1;i>=0;i--){ ans+=na[i]+'0';//从高位到低位依次给字符串ans }
完整代码
#include<bits/stdc++.h> using namespace std; const int L=110; //两个非负整数相加 //方法 倒置相加再还原 string add(string a,string b){ string ans; int na[L]={0},nb[L]={0}; int la=a.size(),lb=b.size(); //倒置 for(int i=0;i<la;i++){ na[la-1-i]=a[i]-'0'; } for(int i=0;i<lb;i++){ nb[lb-1-i]=b[i]-'0'; } //选取最长长度开始相加 int lmax=la>lb?la:lb; for(int i=0;i<lmax;i++){ na[i]+=nb[i]; na[i+1]+=na[i]/10; na[i]%=10; } //如果最高位大于10,即na[lmax-1+1]=1;lmax++ if(na[lmax]){ lmax++; } /***第一次没有处理高位为0d的情况***/ for(int i=lmax-1;i>=0;i--){ if(na[lmax-1]==0) lmax--; } //还原 for(int i=lmax-1;i>=0;i--){ ans+=na[i]+'0'; } return ans; } int main(){ //高精度加法 //用tring 类型传入参数 算法复杂度 O(n) string a,b; while(cin>>a>>b){ cout<<add(a,b)<<endl; } return 0; }
减法运算同理
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<cstring> using namespace std; const int L=110; string sub(string a,string b){ string ans; int na[L]={0},nb[L]={0}; int la=a.size(),lb=b.size(); int lmax=la>lb?la:lb; for(int i=0;i<la;i++){ na[la-1-i]=a[i]-'0'; } for(int i=0;i<lb;i++){ nb[lb-1-i]=b[i]-'0'; } for(int i=0;i<lmax;i++){ na[i]=na[i]-nb[i]; if(na[i]<0){ na[i]=na[i]+10; na[i+1]--; } } for(int i=lmax-1;i>=0;i--){ if(na[lmax-1]==0){ lmax--; } } for(int i=lmax-1;i>=0;i--){ ans+=na[i]+'0'; } return ans; } int main(){ int T; string a,b; scanf("%d",&T); while(T--){ cin>>a>>b; cout<<sub(a,b)<<endl; } return 0; }
相关文章推荐
- 【基础】高精度减法,同高精度加法
- 高精度入门(减法、加法、乘法)之 CODE[VS] 3115、3116、3117
- 高精度加法减法乘法除法
- C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题
- 大数加法 减法 乘法 除法 高精度四则运算
- 整数大数模拟 高精度加法 高精度减法 高精度乘法 高精度除法 c/c++ java
- PKU1737 解题报告 Connected Graph __高精度加法,乘法,减法,组合数
- 高精度运算-(加法减法乘法)
- C++: 高精度加法与高精度减法
- C++ 高精度加法 高精度减法 高精度乘法1
- pku1737(求连通图个数,运用高精度加法,减法,乘法,组合数)
- 整数高精度运算的库(加法,减法,乘法,除法,取模)
- C++大作业之链表实现的高精度加法,减法,和数组实现的高精度乘法。
- 大数加法 减法 乘法 除法 高精度四则运算
- 大数乘法,大数加法,大数减法
- 汇编源码学习10-子程序调用-高精度整数加法
- 高精度大数加法
- 大数加法.减法.乘法.除法
- 【codevs 3116】高精度练习之加法
- UVA424高精度加法