高精度乘法
#include<cstring> #define MAX 105 using namespace std; int x[MAX+10],y[MAX+10],z[MAX*2+10];//积的位数最多是因数位数的两倍 char s[MAXN];//结果 void hMulti(char *a,char *b,char *s){ memset(z,0,sizeof(z));//必须要加,否则多次乘后结果会加上原来的 int len1=strlen(a); int len2=strlen(b); for(int i=0;i<=len1-1;i++)//将字符串中字符转化为数字,并倒序储存 x[i]=a[len1-1-i]-'0'; for(int i=0;i<=len2-1;i++) y[i]=b[len2-1-i]-'0'; /*总结一个规律:即一个数的第i 位和另一个数的第j 位相乘所得的数, 一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。 即:ans[i+j] = a[i]*b[j];*/ for(int i=0;i<len1;i++)//将因数各个位上的数字与另一个各个位上的数字相乘 { for(int j=0;j<len2;j++) z[i+j]+=x[i]*y[j];//先乘起来,后面统一进行进位 } for(int i=0;i<MAX*2;i++)//进行进位 { if(z[i]>=10) //若>=10 { z[i+1]+=z[i]/10; //将十位上数字进位 z[i]=z[i]; //将个位上的数字留下 } } int len3=2*MAX;//结果的位数 for(int i=2*MAX-1;i>0;i--){ if(z[i]==0)len3--;//多一个0就少一位 else break; } for(int i=0;i<len3;i++) s[i]=z[len3-1-i]+'0'; s[len3]='\0'; }大数比较
#incluce<cstring> int bigNumCmp(char *a,char* b){ int bj = 0; int z1_len = strlen(a); int z2_len = strlen(b); if(z1_len==z2_len){ for(int i=0;z2[i];i++){ if(z1[i]> z2[i]){ bj = 1; break; } else if(z1[i] < z2[i]){ bj = -1; break; } } }else if(z1_len > z2_len){ bj = 1; }else if(z1_len < z2_len){ bj = -1; } }