大数乘法,大数加法,大数减法
发布时间:2021-02-26 20:06:24  所属栏目:大数据  来源:网络整理 
            导读:#include iostream #include cstring using namespace std ; class MData { private : int n , m ; char * str1 ,* str2 ; public : char * mul (); //乘法 char * add (); //加法 char * sub (); //减法 char * div (); //除法 MData (); MData ( const cha
                
                
                
            | #include <iostream> #include<cstring> using namespace std; class MData {private: int n,m; char *str1,*str2; public: char *mul();//乘法 char *add();//加法 char *sub();//减法 char *div();//除法 MData(); MData(const char *s1,const char * s2); void init(const char *s1,const char * s2); ~MData(); }; MData::MData() {str1=nullptr; str2 = nullptr; n = 0; m = 0; } MData::MData(const char *s1, const char *s2) {n = (int)strlen(s1); m = (int)strlen(s2);     str1 = new char[n+1]{' '};    str2 = new char[m+1]{' '};strcpy(this->str1,s1); strcpy(this->str2,s2); } void MData::init(const char *s1,s2); } MData::~MData() {if(str1!=nullptr) delete[] str1; if(str2!=nullptr) delete[] str2; } char* MData::mul()//乘法 {int *s = new int[n+m]; memset(s,0,sizeof(int)*(n+m)); for(int i = 0;i<n;i++) for(int k = 0;k<m;k++)         {s[i+k+1] += (str1[i]-'0')*(str2[k]-'0'); } for(int i = n+m-1;i>=0;i--)     {if(s[i]>=10)         {s[i-1] += s[i]/10; s[i] %= 10; } } int i = 0; while(s[i] == 0)     {i++; if(i == n+m) return "0"; }     char *sum = new char[n+m-i+1]{' '};int k = 0; int kn = n+m-i+1; for(;k<kn&&i<n+m;k++,i++)     {sum[k] = s[i]+'0'; } sum[k] = ' '; delete[] s; return sum; } char *MData::add()//加法 {int *s,temp; if(n > m)     {temp = n; s = new int[n+1]; memset(s,sizeof(int)*(n+1)); for(int i = 0;i<n;i++)          {if(i >= n-m) s[i+1] = (str1[i]-'0')+(str2[i-(n-m)]-'0'); else s[i+1] = str1[i]-'0'; } } else     {temp = m; s = new int[m+1]; memset(s,sizeof(int)*(m+1)); for(int i = 0;i<m;i++)         {if(i >= m-n) s[i+1] = (str2[i]-'0')+(str1[i-(m-n)]-'0'); else s[i+1] = str2[i]-'0'; } } for(int i = temp;i>=0;i--)     {if(s[i]>=10)         {s[i-1] += s[i]/10; s[i] %= 10; } } int i = 0; while(s[i] == 0)     {i++; if(i == temp+1) return "0"; }     char *sum = new char[(temp+1)-i+1]{' '};int k = 0; int kn = (temp+1)-i+1; for(;k<kn&&i<temp+1;k++,i++)     {sum[k] = s[i]+'0'; } sum[k] = ' '; delete[] s; return sum; } char *MData::sub() {int *s,temp; bool bt = false; if(n >= m)     {s = new int[n+1]; temp = n; memset(s,sizeof(int)*(n+1)); if(n > m)         {for(int i = 0;i < n;i++)             {if(i >= n-m) s[i+1] = (str1[i]-'0')-(str2[i-(n-m)]-'0'); else s[i+1] = str1[i]-'0'; } } else         {if(strcmp(str1,str2)>0)             {for(int i = 0;i < n;i++)                 {s[i+1] = (str1[i]-'0')-(str2[i]-'0'); } } else             {bt = true; for(int i = 0;i < n;i++)                 {s[i+1] = (str2[i]-'0')-(str1[i]-'0'); } } } } else     {bt = true; s= new int[m+1]; temp = m; memset(s,sizeof(int)*(m+1)); for(int i = 0;i<m;i++)         {if(i >= m-n) s[i+1] = (str2[i]-'0')-(str1[i-(m-n)]-'0'); else s[i+1] = str2[i]-'0'; } } for(int i = temp;i>=0;i--)     {if(s[i] < 0)         {s[i-1] -= 1; s[i] += 10; } } int i = 0; while(s[i] == 0)     {i++; if(i == n+1)         {return "0"; } } char *sum; if(bt)     {        sum = new char[(temp+1)-(i-1)+1]{' '};int k = 0; int kn = (temp+1)-i+1; for(;k<kn&&i<temp+1;k++,i++)         {if(k == 0) sum[k] = '-'; sum[k+1] = s[i]+'0'; } sum[k+1] = ' '; } else     {        sum = new char[(temp+1)-i+1]{' '};int k = 0; int kn = (temp+1)-i+1; for(;k<kn&&i<temp+1;k++,i++)         {sum[k] = s[i]+'0'; } sum[k] = ' '; } delete[] s; return sum; } char *MData::div() {if(n < m) return "0"; else     {if(n == m)         {if(strcmp(str1,str2) < 0) return "0"; else             {int i = 0; char *st = this->sub(); while(st[0]!='-')                 {i++; strcpy(str1,st); st = this->sub(); }                 char *str = new char[2]{0};str[0] = i+'0'; str[1] = ' '; return str; } } else         {int *s = new int[n]; for(int i = 0;i<n;i++) s[i] = 0; int i = 0;             char *str = new char[m]{0};str = strncpy(str,str1,1); str[1] = ' '; char *tp = str1+1; char *temp = str1; str1 = str; while(i<n)             {if(strlen(str1) < m || (strcmp(str1,str2)<0 && strlen(str1) == m))                 {strncpy(str,tp,1); str[1] = ' '; str1 = strcat(str1,str); tp++; i++; } else                 {s[i]++; str1 = this->sub(); } if(i == n)                 {break; } } for(int mm = n-1;mm >= 0;mm--)             {if(s[mm] >= 10)                 {s[mm-1] += s[mm]/10; s[mm] %= 10; } } int nn = 0; while(s[nn] == 0)             {nn++; if(nn == n) return "0"; } char *strchar = new char[n+1 -nn]; memset(strchar,sizeof(char)*(n+1-nn)); int k = 0; for(;k<n && nn < n;k++,nn++)             {strchar[k] = s[nn]+'0'; } strchar[k] = ' '; delete[] temp; return strchar; } } } int main() {int i = 0; while(i<100)     {i++;         char *str1=new char[10000]{' '},*str2=new char[10000]{' '};cin>>str1; cin>>str2; MData sk(str1,str2); char *mul = sk.mul();//乘法 cout << "1:"<< mul << endl; char *add = sk.add();//加法 cout<<"2:" << add<<endl; char *sub = sk.sub();//减法 cout<<"3:"<< sub <<endl; //char *div = sk.div();//除法 //cout<<"4:"<<div<<endl<<endl; if(i == 100)         {delete[]str1; delete[]str2; } } return 0; } 大数除法还有问题,没有时间去完善,如果你完善了,请评论并回复代码哈,谢谢了 (编辑:91站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 


