高精度乘法
高精度乘法写不明白了,求大神详解!!!
程序代码:void Susake_add(char *s1, char *s2){
int len1 = strlen(s1), len2 = strlen(s2), len, i;
int a[N] = {0}, b[N] = {0};
for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
len = len1 > len2 ? len1 : len2;
for(i = 0; i < len; i++) {
a[i] += b[i];
if(a[i] >= 10) {
a[i] %= 10;
a[i+1]++;
}
}
if(a[len]) printf("%d", a[len]);
for(i = len - 1; i >= 0; printf("%d", a[i--]));
}

程序代码:void Susake_mul(char *s1, char *s2){
int len1 = strlen(s1), len2 = strlen(s2), len, i, j, k = 0, tip = 0, tag = 0;
int a[N] = {0}, b[N] = {0}, c[N] = {0};
for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
for(i = 0; i < len1; i++) {
for(j = 0; j < len2; j++) {
if(a[i] * b[j] >= 10) {
c[k] += a[i] * b[j] % 10;
if(c[k] >= 10){
c[k] = c[k] % 10;
c[k + 1]++;
}
c[k + 1] += a[i] * b[j] / 10;
if(c[k + 1] >= 10){
c[k + 1] = c[k + 1] % 10;
c[k + 2]++;
}
}
else {
c[k] += a[i] * b[j];
if(c[k] >= 10) {
c[k] = c[k] % 10;
c[k + 1]++;
if(c[k + 1] >= 10){
c[k + 1] = c[k + 1] % 10;
c[k + 2]++;
}
}
}
k++;
tag = k;
}
tip++;
k = tip;
}
if(c[tag]) printf("%d", c[tag]);
for(i = tag - 1; i >= 0; i--)
printf("%d", c[i]);
}

程序代码:char *Susake_com(char *a, char *b)
{
char *res;
res = (char *)malloc(10 * sizeof(char));
int len1 = strlen(a), len2 = strlen(b), i, t = 0;
if(a[0] != '-' && b[0] != '-') {
if(len1 > len2) {
strcpy(res, "a>b");
return res;
}
else if(len1 == len2) {
for(i = 0; i < len1; i++) {
t++;
if((a[i] - '0') == (b[i] - '0')) ;
else if((a[i] - '0') < (b[i] - '0')) {
strcpy(res, "a<b");
return res;
}
else {
strcpy(res, "a>b");
return res;
}
if(t == len1) {
strcpy(res, "a==b");
return res;
}
}
}
else {
strcpy(res, "a<b");
return res;
}
}
if(a[0] == '-' && b[0] == '-') {
if(len1 > len2) {
strcpy(res, "a<b");
return res;
}
else if(len1 == len2) {
for(i = 1; i < len1; i++) {
t++;
if((a[i] - '0') == (b[i] - '0')) ;
else if((a[i] - '0') > (b[i] - '0')) {
strcpy(res, "a<b");
return res;
}
else if((a[i] - '0') < (b[i] - '0')) {
strcpy(res, "a>b");
return res;
}
if(t == len1 - 1) {
strcpy(res, "a==b");
return res;
}
}
}
else {
strcpy(res, "a>b");
return res;
}
}
if(a[0] == '-' && b[0] != '-') {
strcpy(res, "a<b");
return res;
}
if(b[0] == '-' && a[0] != '-') {
strcpy(res, "a>b");
return res;
}
}
程序代码:void Susake_sub(char *s1, char *s2)
{
int len, len1, len2, i, j;
int a[N] = {0}, b[N] = {0};
char s3[N];
memset(s3, 0, sizeof(s3));
char *s = (char *)malloc(10 * sizeof(char));
s = Susake_com(s1, s2);
if(strcmp("a<b", s) == 0) {
strcpy(s3, s1);
strcpy(s1, s2);
strcpy(s2, s3);
printf("-");
}
free(s);
len1 = strlen(s1); len2 = strlen(s2);
for(i = 0; i < len1; a[i] = s1[len1 - 1 - i++] - '0') ;
for(i = 0; i < len2; b[i] = s2[len2 - 1 - i++] - '0') ;
len = len1 > len2 ? len1 : len2;
for(int i = 0; i < len; i++) {
if(a[i] - b[i] >= 0) a[i] -= b[i];
else {
a[i] = a[i + 1] == 0 && i + 1 == len1 ? b[i] - a[i] : a[i] + 10 - b[i];
a[i + 1]--;
}
}
if(a[len - 1] || len == 1) printf("%d", a[len - 1]);
for(int i = len - 2; i >= 0; i--)
printf("%d", a[i]);
printf("\n");
}
