大数加法代码 注释 如下:
#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 即可。