题目描述
http://poj.org/problem?id=2389
大整数乘法
题目分析
- 两个乘数都是大整数,相比于大整数乘int要适用的更广泛一些
- 乘法需要注意进位
- 相乘之后的结果要注意前导0,就是字符数组前面无意义的0,需要去掉
- 这道题说40位以内是假的。。。开数组的时候开的大一些
代码
#include<stdio.h>
#include<string.h>
#define N 100
int num_arr[N];
char* multi(char *a,char *b){
int la=strlen(a);
int lb=strlen(b);
//计算每一位
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
num_arr[i+j+1]+=(a[i]-'0')*(b[j]-'0');
}
}
//算每一位的进位
for(int i=la+lb-1;i>=0;i--){
if(num_arr[i]>=10){
num_arr[i-1]+=num_arr[i]/10;
num_arr[i]%=10;
}
}
//将int*换成char*输出(不换的话其实也可以,直接输出)
char *res=new char[la+lb+1];
//去掉前导0
int i=0;
while(num_arr[i]==0){
i++;
}
int j;
for(j=0;i<la+lb;i++,j++){//这里是i,是i,是i<la+lb
res[j]=num_arr[i]+'0';
}
res[j]='\0';//字符串数组最后一位,没这一步后导0去不掉
return res;
}
char a[N],b[N];
int main() {
scanf("%s",a);
scanf("%s",b);
char *res=multi(a,b);
printf("%s\n",res);
delete[] res;
return 0;
}