# 字符串转成整数大数乘法

2016-12-02 12:52:23来源:网络收集作者:管理员人点击

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

Subscribe to see which companies asked this question

#include
#include
void str_multi(int m, char* str1, int n, char * str2){
int result[m+n], tmp[n][m+1], a[m], b[n], i, j, count, c;
i = 0;
while(i < m){                                           //把字符串转换成整数存放到数组中
a[i] = str1[m-i-1] - '0';
i++;
}
i = 0;
while(i < n){
b[i] = str2[n-i-1] - '0';
i++;
}
i = 0;
while(i < n){                                           //把计算结果放到二维数组中考虑到进位数组的每一行比被乘数长度+1
c = 0;                                          // 用于保存每次乘法的进位
for(j = 0; j < m; j++ ){
tmp[i][j] = b[i] * a[j] % 10 + c;
c = b[i] * a[j] / 10;
}
tmp[i][j] = c;
i++;
}
count = c = 0;
while(count < m+n){                                     //把二维数组中的数按对应的位相加得到每一位的数
if(count <= m){
i = 0; j = count;
}else{                                          //位数超出被乘数长度时
i = count -m;
j = m;
}
result[count] = c;
while(i < n && j >= 0){
result[count] += tmp[i++][j--];         //计算时一定要个位十位百位相对应的加
}
c = result[count]/10;                           //考虑相加后的进位
result[count] = result[count]%10;
count++;
}
for(i = 0; i < m+n; i++){
printf("%d", result[m+n-i-1]);
}
}int main(void){
//char str1[20], str2[20];
int m, n, i;
char ch;
i = 0;
/*while(getchar() != '/n');
while((ch = getchar()) <= '9' && ch >= '0' && i < 20) str1[i++] = ch;
while(getchar() != '/n');
while((ch = getchar()) <= '9' && ch >= '0' && i < 20) str2[i++] = ch;*/
char *str1 = "123455";
char *str2 = "2222";
m = strlen(str1);
n = strlen(str2);
str_multi(m, str1, n, str2);
return 0;
}

int main(void){
char str1[50], str2[50];
int m, n, i;
char ch;
i = 0;
while((ch = getchar()) <= '9' && ch >= '0') str1[i++] = ch;          //读取第一个字符串
str1[i] = '/0';
m = i;
i = 0;
while((ch = getchar()) <= '9' && ch >= '0') str2[i++] = ch;         //读取第二个字符串
str2[i] = '/0';
n = i;
str_multi(m, str1, n, str2);
return 0;
}