【极基础】大整数 四则运算|代码“渣”实现

来源:互联网 发布:淘宝百度百科 编辑:程序博客网 时间:2024/05/16 19:41

【极基础】大整数 四则运算|代码“渣”实现

加法

======================================

#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int MAXN=10000;int num1[MAXN]={0},num2[MAXN]={0},ans[MAXN+1]={0};string big_add(string str1,string str2){    if(str1=="0"&&str2=="0")return "0";    for(int i=0;i<str1.length();i++)num1[i]=str1[str1.length()-i-1]-'0';    for(int i=0;i<str2.length();i++)num2[i]=str2[str2.length()-i-1]-'0';    int len=max(str1.length(),str2.length());    for(int i=0;i<len;i++)    {ans[i]+=num1[i]+num2[i];if(ans[i]>9){ans[i+1]++;ans[i]%=10;}}    return "1";}int main(){    string str1,str2;    cin>>str1>>str2;    big_add(str1,str2);    int len=max(str1.length(),str2.length());if(!ans[len])len--;    for(int i=len;i>=0;i--)cout<<ans[i];return 0;}

减法

======================================

#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int MAXN=100000;int num1[MAXN]={0},num2[MAXN]={0},ans[MAXN]={0};int big_minus(string str1,string str2){    if(str1==str2)return 0;    for(int i=0;i<str1.length();i++)num1[i]=str1[str1.length()-i-1]-'0';    for(int i=0;i<str2.length();i++)num2[i]=str2[str2.length()-i-1]-'0';    for(int i=0;i<str1.length();i++)    {ans[i]+=num1[i]-num2[i];if(ans[i]<0){ans[i+1]--;ans[i]+=10;}}    return 1;}bool compare_swap(string& str1,string& str2){    if(str1.length()>str2.length())return false;    else if(str1.length()<str2.length()||str1<str2){swap(str1,str2);return true;}    return false;}int main(){    string str1,str2;    cin>>str1>>str2;    bool o=compare_swap(str1,str2);    if(o)cout<<'-';    if(!big_minus(str1,str2))cout<<0;    else {o=true;    for(int i=str1.length();i>=0;i--)if(ans[i]==0&&o)continue;else{o=false;cout<<ans[i];}}return 0;}

乘法

======================================

#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int MAXN=100000;int num1[MAXN]={0},num2[MAXN]={0},ans[2*MAXN]={0};int big_mult(string str1,string str2){    if(str1=="0"||str2=="0")return 0;    int len1=str1.length(),len2=str2.length();    for(int i=0;i<len1;i++)num1[i]=str1[str1.length()-i-1]-'0';    for(int i=0;i<len2;i++)num2[i]=str2[str2.length()-i-1]-'0';    for(int i=0;i<len1;i++)for(int j=0;j<len2;j++)    {ans[i+j]+=num1[i]*num2[j];}    for(int i=0;i<len1+len2;i++)if(ans[i]>9){ans[i+1]+=ans[i]/10;ans[i]%=10;}    return 1;}int main(){    string str1,str2;    cin>>str1>>str2;    int len1=str1.length(),len2=str2.length();    if(!big_mult(str1,str2))cout<<0;    else {bool o=true;    for(int i=len1+len2;i>=0;i--)if(ans[i]==0&&o)continue;else{o=false;cout<<ans[i];}}return 0;}

除法

======================================

#include<iostream>#include<string.h>#include<algorithm>using namespace std;const int MAXN=100000;int ans[MAXN]={0},ans1[MAXN]={0};bool compare(int num1[],int num2[]){    for(int i=MAXN-1;i>=0;i--)        if(num1[i]>num2[i])return true;        else if(num1[i]<num2[i])return false;    return true;}int big_minus(int num1[],int num2[]){    memset(ans1,0,sizeof(ans1));    for(int i=0;i<MAXN;i++)    {ans1[i]+=num1[i]-num2[i];if(ans1[i]<0){ans1[i+1]--;ans1[i]+=10;}}    return 1;}int big_devition(string str1,string str2){    int num1[MAXN]={0},num2[MAXN]={0};string str3;    int len1=str1.length(),len2=str2.length();    for(int i=0;i<len1;i++)num1[i]=str1[str1.length()-i-1]-'0';    for(int i=0;i<len2;i++)num2[i]=str2[str2.length()-i-1]-'0';    if(len1<len2||str1=="0"||compare(num2,num1))return 0;    if(len1!=len2)for(int i=len1-len2;i>=-1;i--){num2[len2+i]=num2[2*len2-len1+i];num2[2*len2-len1+i]=0;}    for(int i=len1-len2-1;i>=-1;i--)    {int k=0;    while(compare(num1,num2)){big_minus(num1,num2);memcpy(num1,ans1,sizeof(num1));k++;}    for(int j=0;j<=len1;j++)num2[j]=num2[j+1];ans[i+1]=k;    }    return 1;}int main(){    string str1,str2;    cin>>str1>>str2;    if(str2=="0")cout<<"INF";    else if(str1==str2)cout<<1;    else if(!big_devition(str1,str2))cout<<0;    else {bool o=true;    for(int i=str1.length();i>=0;i--)if(ans[i]==0&&o)continue;else{o=false;cout<<ans[i];}}return 0;}
原创粉丝点击