大数加减乘除
2013-08-30 16:00
190 查看
#include <iostream> using namespace std; #define MAXLEN 255 int* str2int(char* str) { int len = strlen(str), i; int * a = new int[len*sizeof(int)]; for(i=0; i<len; ++i) a[i] = (int)(str[len-i-1] - '0'); return a; } char* int2str(int* a,int len) { int i; char* str = new char[(len+1)*sizeof(char)]; for(i=0; i<len; ++i) str[i] = (char)(a[len-i-1] + '0'); str[len] = '\0'; return str; } //归整操作 int check(int * a, int len) { int k; 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++; return len; } char* addition(char* str1, char* str2) { int len,len1,len2,i; len1 = strlen(str1); len2 = strlen(str2); len = (len1>=len2)?len1:len2; int* t1 = new int[(len+1)*sizeof(int)]; int* t2 = new int[(len+1)*sizeof(int)]; t1 = str2int(str1); t2 = str2int(str2); 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+1); return int2str(t1,len); } char* subtract(char* str1, char* str2) { int i,len1,len2,len,flag=0; len1 = strlen(str1); len2 = strlen(str2); len = (len1>=len2)?len1:len2; char* temp = new char[len*sizeof(char)]; char* result = new char[(len+1)*sizeof(char)]; int* t1 = new int[len*sizeof(int)]; int* t2 = new int[len*sizeof(int)]; if(len1<len2 || (len1==len2)&&strcmp(str1,str2)<0) { flag = 1; strcpy(temp, str1); strcpy(str1, str2); strcpy(str2, temp); len1=strlen(str1); len2=strlen(str2); } t1 = str2int(str1); t2 = str2int(str2); for(i=len1; i<len; ++i) t1[i]=0; for(i=len2; i<len; ++i) t2[i]=0; for(i=0; i<len; ++i) { if(t1[i] >= t2[i]) t1[i]-=t2[i]; else { t1[i]-=t2[i]; int c = t1[i]*(-1)/10+1; t1[i] = t1[i] + c*10; t1[i+1] -= c; } } int begin=0; while(t1[len-1]==0 && len>1) len--; if(flag) { result[0] = '-'; begin++; len++; } for(;begin<len; ++begin) result[begin] = (char)(t1[len-begin-1] + '0'); result[begin] = '\0'; return result; } char* multiply(char* str1, char* str2) { int i,j,len,len1,len2; len1=strlen(str1); len2=strlen(str2); len = len1 + len2; int* t1 = new int[len1*sizeof(int)]; int* t2 = new int[len2*sizeof(int)]; int* result = new int[len*sizeof(int)]; t1=str2int(str1); t2=str2int(str2); for(i=0; i<len; ++i) result[i]=0; for(i=0; i<len1; ++i) for(j=0; j<len2; ++j) result[i+j]+=t1[i]*t2[j]; check(result, len); while(result[len-1]==0 && len>1) len--; return int2str(result, len); } void divide(char* str1, char* str2, char*& remainder, char*& quotient) { int len1, len2, len, i; len1 = strlen(str1); len2 = strlen(str2); remainder = new char[len1*sizeof(char)]; quotient = new char[len1*sizeof(char)]; if(len1<len2 || ((len1==len2)&&strcmp(str1,str2)<0)) { remainder = str1; quotient = "0"; } else if(strcmp(str1,str2) == 0) { remainder = "0"; quotient = "1"; } else { int* temp = new int[len2*sizeof(int)]; remainder[0] = '\0'; len = strlen(remainder); for(i=0; i<len1; ++i) { temp[i] = 0; remainder[len] = str1[i]; remainder[len+1] = '\0'; //cout<<remainder<<endl; len = strlen(remainder); while(len > len2 ||(len==len2 && strcmp(remainder, str2)>=0)) { remainder = subtract(remainder, str2); if(remainder[0] == '0') remainder[0] = '\0'; //cout<<remainder<<endl; len = strlen(remainder); temp[i]++; } quotient[i] = (char)(temp[i] + '0'); } int j = 0; while(quotient[j] == '0' && j<len1) j++; //删除前导0 for(i=0; i<len1-j; ++i) quotient[i] = quotient[j+i]; quotient[len1-j] = '\0'; } } int main() { char str1[MAXLEN], str2[MAXLEN], str[MAXLEN]; char* remainder,*quotient; cin>>str1>>str2; divide(str1, str2, remainder, quotient); //cout<<multiply(str1, str2)<<endl; cout<<quotient<<" "<<remainder<<endl; system("pause"); return 0; }
参考《ACM/ICPC程序设计与分析》 清华大学版。
相关文章推荐
- Java 大数加减乘除 hdu 5047
- hdu 4927 Series 1 (大数模板加减乘除)
- 每日一练——大数加减乘除运算实现
- 大数(高精度)加减乘除
- 使用String模拟大数加减乘除(除法和取余待补充)
- 大数的加减乘除运算(C++)
- 大数加减乘除?
- 大数运算实现加减乘除四则运算
- uva 10494(大数加减乘除取余一条龙模板代码) uva 10023 (大数开方)
- 大数高精度加减乘除 51nod 1005 大数加法
- java 大数操作(加减乘除及取余)
- 大数加减乘除
- 大数运算之加减乘除
- [源码]个人的大数相乘法及[转载]大数加减乘除法完全设计
- 大数的加减乘除
- 模版--大数加减乘除
- java大数加减乘除
- 大数的加减乘除、取对数、求次方、进制转换、三角函数的原理
- 大数(加减乘除)
- 补码表示的大数加减乘除运算程序设计