大數加法代碼 註釋 如下:
#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 即可。