由于深受大数的压榨,不得不写几个模板自己套用,
先写简单的加减吧,
大数以字符串输入,最后返回的值也是字符串型的。
1 string bigadd(string s,string ss){ 2 string tt; 3 int slen = s.length(); 4 int sslen = ss.length(); 5 reverse(s.begin(),s.end()); 6 reverse(ss.begin(),ss.end()); 7 int index = 0; 8 for(int i=0;i<min(slen,sslen);i++){ 9 int a = s[i]-'0',b = ss[i]-'0'; 10 int at = a+b+index; 11 if(at>9){ 12 tt+=at-10+'0'; 13 index = 1; 14 }else{ 15 tt+=at+'0'; 16 index = 0; 17 } 18 } 19 for(int i=min(slen,sslen);i<max(slen,sslen);i++){ 20 if(slen>i){ 21 int a = s[i]-'0'; 22 int at = a+index; 23 if(at>9){ 24 tt+=at-10+'0'; 25 index = 1; 26 }else{ 27 tt+=at+'0'; 28 index = 0; 29 } 30 }else{ 31 int b = ss[i]-'0'; 32 int at = b+index; 33 if(at>9){ 34 tt+=at-10+'0'; 35 index = 1; 36 }else{ 37 tt+=at+'0'; 38 index = 0; 39 } 40 } 41 } 42 if(index){ 43 tt+='1'; 44 } 45 reverse(tt.begin(),tt.end()); 46 return tt; 47 }
大数减法:
同样也是先输入两个字符串型的大数,但是这里有个前提就是,s>=ss;
可以输入之前先比较一下啊,
用比较函数,如下:
1 string bigdel(string s,string ss){//s>=ss 2 string tt,st; 3 int slen = s.length(); 4 int sslen = ss.length(); 5 reverse(s.begin(),s.end()); 6 reverse(ss.begin(),ss.end()); 7 int index = 0; 8 for(int i=0;i<sslen;i++){ 9 int a = s[i]-'0'; 10 int b = ss[i]-'0'; 11 int at = a-b-index; 12 if(at<0){ 13 tt+=at+10+'0'; 14 index = 1; 15 }else{ 16 tt+=at+'0'; 17 index = 0; 18 } 19 } 20 for(int i=sslen;i<slen;i++){ 21 int b = s[i]-'0'; 22 int at = b - index; 23 if(at<0){ 24 tt+=at+10+'0'; 25 index = 1; 26 }else{ 27 tt+=at+'0'; 28 index = 0; 29 } 30 } 31 bool prime = true; 32 for(int i = slen-1;i>=0;i--){ 33 if(tt[i]!='0'){ 34 prime = false; 35 } 36 if(!prime){ 37 st+=tt[i]; 38 } 39 } 40 if(st.length()==0) 41 st+='0'; 42 return st; 43 }
比较两个字符串大小,
这里返回的是int类型的,如果s>ss 返回1,s<ss 返回0,s==ss返回2;
1 int compare(string s,string ss){ 2 int slen = s.length(); 3 int sslen = ss.length(); 4 if(slen==sslen){ 5 for(int i=0;i<slen;i++){ 6 if(s[i]==ss[i]){ 7 continue; 8 }else{ 9 return s[i]>ss[i]; 10 } 11 } 12 }else{ 13 return slen > sslen; 14 } 15 return 2; 16 }
大数乘法:
输入两个数字符串,最后返回的也是字符串。
1 string bigmulti(string s,string ss){ 2 int slen = s.length(); 3 int sslen= ss.length(); 4 int st[20100]; 5 string tt=""; 6 reverse(s.begin(),s.end()); 7 reverse(ss.begin(),ss.end()); 8 for(int i=0;i<slen;i++){ 9 for(int j=0;j<sslen;j++){ 10 st[i+j] += (s[i]-'0')*(ss[j]-'0'); 11 } 12 } 13 for(int i=0;i<slen+sslen;i++){ 14 st[i+1]+=st[i]/10; 15 st[i]=st[i]%10; 16 } 17 int index; 18 for(int i=slen+sslen;i>=0;i--){ 19 if(st[i]!=0){ 20 index = i; 21 break; 22 } 23 } 24 for(int i=0;i<=index;i++){ 25 tt+=st[i]+'0'; 26 } 27 reverse(tt.begin(),tt.end()); 28 return tt; 29 }
emmmmmmm.......就这样吧,除法不常用就不想写了。