今天看到的题如下所示:
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<stdio.h>
#include<string.h>
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;
}
代码main()函数中读取字符串部分还有点问题,这部分不是很熟练,时间关系明天再来修改。
修改后可以从控制台输入字符串 修改部分代码如下:
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;
}