高精度計算

來源:互聯網
上載者:User
// 高精度加法#include<iostream>#include<cstring>using namespace std;int* strtoint(char *str){    int i,len=strlen(str);    int* a=new int[(len+1)*sizeof(int)];    for(i=0;i<len;i++)        a[i]=(int)str[len-i-1]-48;    return a;}char* inttostr(int* a,int n){    int i;    char* str=new char[(n+1)*sizeof(char)];    for(i=0;i<n;i++)        str[i]=(char)a[n-i-1]+48;    str[n]='\0';    return str;}int check(int* a,int n){    int k=0,len=n;    while(a[len-1]==0&&len>1)        len--;    for(k=0;k<len;k++)    if(a[k]>=10)    {       a[k+1]=a[k+1]+a[k]/10;       a[k]=a[k]%10;    }    if(a[k]!=0)        len=k+1;    return len;}char* addition(char* m1,char* m2){  int i,len1,len2,len,c=0;  int* t1,*t2;  len1=strlen(m1);  len2=strlen(m2);  len=(len1>=len2)?len1:len2;  t1=new int[(len+2)*sizeof(int)];  t2=new int[(len+2)*sizeof(int)];  t1=strtoint(m1);  t2=strtoint(m2);  for(i=len1;i<len+1;i++)    t1[i]=0;  for(i=len2;i<len+1;i++)    t2[i]=0;  for(i=0;i<len;i++)    t1[i]+=t2[i];    len=check(t1,len);    return inttostr(t1,len);}int main(){    char m1[1000],m2[1000];    while(cin>>m1>>m2)    cout<<addition(m1,m2)<<endl;    return 0;}//高精度乘法#include<iostream>#include<cstring>using namespace std;int* strtoint(char* str){    int i,len;    len=strlen(str);    int* a=new int[(len+1)*sizeof(int)];    for(i=0;i<len;i++)    a[i]=(int)str[len-i-1]-48;    return a;}char* inttostr(int* a,int n){    char* str=new char[(n+1)*sizeof(char)];    for(int i=0;i<n;i++)    str[i]=(char)a[n-i-1]+48;    str[n]='\0';    return str;}int check(int* a,int n){    int k,len=n;    while(a[len-1]==0&&len>1)          len--;    for(k=0;k<len;k++)    {        a[k+1]+=a[k]/10;        a[k]%=10;    }    if(a[k]!=0)        len=k+1;    return len;}char* multiply(char* m1,char* m2){    int i,j,len1,len2,len,c=0,*t1,*t2,*prod;    len1=strlen(m1);    len2=strlen(m2);    len=len1+len2;    t1=new int[(len1+1)*sizeof(int)];    t2=new int[(len2+1)*sizeof(int)];    prod=new int[(len+1)*sizeof(int)];    t1=strtoint(m1);    t2=strtoint(m2);    for(i=0;i<len+1;i++)        prod[i]=0;    for(i=0;i<len1;i++)        for(j=0;j<len2;j++)        prod[i+j]+=t1[i]*t2[j];    len=check(prod,len);    return inttostr(prod,len);}int main(){    char m1[1000],m2[1000];    while(cin>>m1>>m2)      cout<<multiply(m1,m2)<<endl;    return 0;}
// 高精度減法#include<iostream>#include<cstring>using namespace std;int* strtoint(char* str){    int len,i;    len=strlen(str);    int* a=new int[(len+1)*sizeof(int)];    for(i=0;i<len;i++)        a[i]=(int)str[len-i-1]-48;    return a;}char* inttostr(int* a,int n){    char* str=new char[(n+1)*sizeof(int)];    for(int i=0;i<n;i++)        str[i]=(char)a[n-i-1]+48;        str[n]='\0';    return str;}int check(int* a,int n){    int i,len=n;     while(len>1&&a[len-1]==0)        len--;     for(i=0;i<len;i++)        {            a[i+1]+=a[i]/10;            a[i]%=10;        }        if(a[i]!=0)            len=i+1;        return len;}char* subtract(char *m1,char *m2){    int i,len1,len2,len,c=0,*t1,*t2,cf=0;    char* temp,* csub;    len1=strlen(m1);    len2=strlen(m2);    len=(len1>=len2)?len1:len2;    t1=new int[(len+2)*sizeof(int)];    t2=new int[(len+3)*sizeof(int)];    temp=new char[(len+2)*sizeof(char)];    csub=new char[(len+2)*sizeof(char)];    if((len>len1)||(len2==len1)&&strcmp(m1,m2)<0)    {// 當被減數小於減數時        strcpy(temp,m1);        strcpy(m1,m2);        strcpy(m2,temp);        cf=1;        len1=strlen(m1);  //注意此時m1與m2已交換        len2=strlen(m2);    }    t1=strtoint(m1);    t2=strtoint(m2);    for(i=len1;i<len;i++)        t1[i]=0;  //缺位前置補0    for(i=len2;i<len;i++)        t2[i]=0;   //缺位前置補0    for(i=0;i<len;i++)    {   //減法過程        if(t1[i]>=t2[i])            t1[i]-=t2[i];        else {            t1[i]-=t2[i];            c=(t1[i]*(-1)/10+1);            t1[i]+=10*c;            t1[i+1]-=c;        }    }    int n=i,begin=0;    while(t1[n-1]==0&&n>1)        n--;    if(cf==1)    //若差為負數    {        csub[0]='-';        n++;        begin=1;    }    for(i=begin;i<n;i++)        csub[i]=(char)t1[n-i-1]+48;       csub[n]='\0';       return csub;}int main(){    char m1[1000],m2[1000];      while(cin>>m1>>m2)        cout<<subtract(m1,m2)<<endl;    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.