问题描述:
Calculate A × B
Input
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.
Output
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
Input and output are the same with problem 1001.
But A and B may be big integer.
The biggest integer is less than 10^500.
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 500
void reverse(char *num,char *newnum){ /*reverse()函数用于颠倒字符串,将num字符串以反顺序存放到newnum中,目的是将便于之后从个位进行计算*/
int length=strlen(num);
int i,j;
for(i=0,j=length-1;i<length;i++,j--){
newnum[i]=num[j];
}
}
void transform(char* num_char,int *num_int){ /*transform()函数用于将num_char字符串转换成整数字符串,便于进行数字计算*/
int len=strlen(num_char);
int i;
char *newchar;
newchar=(char*)malloc(sizeof(char)*len);
reverse(num_char,newchar);
for(i=0;i<len;i++){
num_int[i]=newchar[i]-'0';
}
}
void multiply(char *num1,char *num2,int *result){ /*multiply()函数将传入的两个大数的字符串形式在内部转换后相乘,将结果返回给整数数组*/
int i,j,k;
int len1=strlen(num1);
int len2=strlen(num2);
int numint1[len1],numint2[len2];
transform(num1,numint1);
transform(num2,numint2);
int len3=len2+len1;
for(i=0;i<len3;i++){
result[i]=0;
}
for(i=0;i<len1;i++){
for(j=0;j<len2;j++){
result[i+j]+=numint1[i]* numint2[j];
}
}
for(i=0;i<len3;i++){
result[i+1]+=(result[i]/10);
result[i]=(result[i]%10);
}
}
void display(int *result)/*将整个整数数组显示,其中数组前面的0不显示,这样达到显示正确结果的目地*/
{
int i=2*N-1;
while(result[i]==0)
{
i--;
}
for(i;i>=0;i--)
{
printf("%d",result[i]);
}
printf("\n");
}
int main(void)
{
char number1[N],number2[N];
int result[2*N];
int i,j;
while(scanf("%s%s",number1,number2)==2)
{
for(i=0;i<2*N;i++){
result[i]=0;
}
multiply(number1,number2,result);
display(result);
}
return 0;
}
这道题虽然没那么难,但是我花了一个多星期才陆陆续续写出来,对每个函数编写了测试模块(原谅我是真的菜,在参考了别人的代码之后,还是不能正确写出来,后面大多数时间都在调试...,对每个函数编写测试模块的原因是我找不出哪里除了问题,一直说Segementation fault.能写出来是真的开心,后面再参考其他更先进的算法)