大数加法 以及 大数减法的思路
来源:互联网 发布:gta5亚洲美女捏脸数据 编辑:程序博客网 时间:2024/05/10 08:21
大数加法代码 注释 如下:
#include<iostream>#include<ctype.h>#include<cstdio>#include<algorithm>using namespace std;#include<cstring>#include<string.h>char A[10005],B[10005],res[10005];int cmp(char *a,char *b){ int lena=strlen(a); int lenb=strlen(b); if(lena!=lenb) //如果 a的长度不等与b的长度 返回a《b为真 如果a》b返回假 return lena<lenb; for(int i=0;i<lena;i++) //如果a的长度==b的长度 紧接着比较每个字符的大小 返回 a[i]<b[i]为真 如果a[i]》b[i] 返回假 if(a[i]!=b[i]) return a[i]<b[i];return 0;}void add(char *a,char *b) // 相加时不明大小{ int lena=strlen(a); int lenb=strlen(b); if(lena>lenb) //两个正数相加 确定某一个长度一直为最大长度 方便一次性计算 swap(a,b),swap(lena,lenb); reverse(a,a+lena); reverse(b,b+lenb); int len=lenb; for(int i=lena;i<len;i++) // len=lenb 这个最大的定值 就是上面 所说的方便一次性计算的意思 a[i]='0'; // 将两个串的长度一致 因此需要对 短的字符串后面填‘0’; int c=0; for(int i=0;i<len;i++) //大数相加 { int t=(a[i]-'0')+(b[i]-'0')+c; c=(t>=10); res[i]=(t-10*c)+'0'; // 因为前一部分是数字 需加‘0’ } if(c) res[len++]='1'; //最后一位数 res[len]='\0'; //终止条件 reverse(res,res+len); //再转置}void jian(char *a,char *b) //知道大小 a大与b 1.a的位数大与b 2.位数相等并且a》b{ int lena=strlen(a); int lenb=strlen(b); reverse(a,a+lena); //转置 reverse(b,b+lenb); int len=lena; //最长的赋给一个变量 for(int i=lenb;i<len;i++) //对短的进行填‘0’ b[i]='0'; int c=0; for(int i=0;i<len;i++) //大数减法 { int t=(a[i]-'0')-(b[i]-'0')-c; c=(t<0); res[i]=t+10*c+'0'; } res[len]='\0'; //终止符 while(len>1&&res[len-1]=='0') //大数减法的一个特殊判定条件 res[--len]='\0'; reverse(res,res+len);}int main(){ cin>>A>>B; bool isa=isdigit(A[0]); //判断正负 如果为正返回真 为负返回假 bool isb=isdigit(B[0]); if(isa) //如果大数A 是正数 { if(isb) // 并且 大数B为正数 add(A,B); // 则符合第一个情况 《正正《正数相加》大加小/小加大》 else { if(cmp( A , B + 1 )) //条件为真说明B+1大于A 《正负《正负相加==正负号(同最大的)(大的减小的)》正负号(同最大的)(大减小)》 { //而此处的判断 是判断负的大 意思是b+1>a cout<<"-"; jian(B+1,A); //传值的时候非常巧 先传大的 再传小的 } else //否则就是A>B jian(A,B+1); //先传大的再传小的 } } else { if(isb) // a为负 并且b为正 { if(cmp(A+1,B)) //判断 正值是否大于负值 jian(B,A+1); //如果正值大于负值 直接进行相减 因为最后是一个正数 所以 直接套用正数减正数(大数减法)此处减少了许多麻烦 else { cout<<"-"; // 正值小于负值 因此最后答案是-的 因此多输出一个负值 jian(A+1,B); //大数减法 } } else { cout<<"-"; //都为负的 直接输出- add(A+1,B+1); //-值+ -值 得到的结果是两个负值相加 因此调用 大数加法 } } cout<<res<<endl; //输出最后的字符串 return 0;除法}
大数除法的思路:
解题思路
基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个
一个减显然太慢,如何减得更快一些呢?以7546 除以23 为例来看一下:开始商为0。先减
去23 的100 倍,就是2300,发现够减3 次,余下646。于是商的值就增加300。然后用646
减去230,发现够减2 次,余下186,于是商的值增加20。最后用186减去23,够减8 次,
因此最终商就是328。
所以本题的核心是要写一个大整数的减法函数,然后反复调用该函数进行减法操作。
计算除数的10 倍、100 倍的时候,不用做乘法,直接在除数后面补0 即可。
阅读全文
0 0
- 大数加法 以及 大数减法的思路
- 数学问题--大数乘以小数,大数乘以大数,大数的加法以及减法
- 大数的加法,减法,乘法
- 大数加法和大数减法
- 大数减法、加法、乘法
- 大数加法和减法
- 大数加法与减法
- 大数加法、减法、乘法
- 大数加法(减法) C++
- 大数加法、大数乘法、大数减法。Swift。
- 大数乘法,大数加法,大数减法
- 大数运算的加法和减法
- 大数加法.减法.乘法.除法
- 大数加法,减法,乘法总结
- 大数加法、减法和乘法
- 使用C++类实现大数加法,大数减法,大数乘法
- 大数模板 大数加法,大数减法,大数乘法,大数除法,大数比较等操作
- 大数的减法
- pyqt5 窗口文件示范
- 设计模式之开放封闭原则
- Android第三方框架之学习高德地图SDK-----①集成环境,获取定位信息,地图显示。
- 简析URI与URL的不同
- notepad++使用
- 大数加法 以及 大数减法的思路
- python之面向对象
- 习题6.10
- 文件服务器-ftp
- Git使用记录
- B
- JQuery中css与attr的比较
- 两个数的乘积
- Dynamic OCT 和 Dynamic ODT 详细说明