这是一道经典的上机题目
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100 //N代表乘数的位数,根据具体应用,想设多大设多大。
/*****
* Function: 大整数相乘算法
* 参数:
* a: 乘数
* b: 乘数
* n: a的长度
* m: b的长度
* 没有返回值,结果直接放到全局变量res数组中,如果不想要全局变量,也可以在函数中多加一个参数,保存结果。
*****/
void swap(char *s,int p,int r)
{
char ct;
int i,j;
for(i=p,j=r;i<j;i++,j--)
{
ct=s[i];
s[i]=s[j];
s[j]=ct;
}
}
void Multiply(char *a,char *b,int n,int m,char *ret) // 大整数相乘
{
int i,j,temp,t,tt;
int num;
for(i=0;i<m;i++)
{
temp=0;
for(j=0;j<n;j++)
{
t=(a[n-1-j]-'0')*(b[m-1-i]-'0')+temp;
if(0 == t)
continue;
num = j+i;
tt = ret[num]+(t);
ret[num] = tt%10;
temp = tt/10;
}
if( temp > 0 )
{
ret[++num] += temp;
}
}
swap(ret,0,num);
for(i=0;i<=num;i++)
ret[i]+='0';
}
void LargeMutiply(char *s1 ,char *s2 ,char *ret)
{
int i,j;;
for(i=0;i<2*N+1;i++)
{
ret[i]=0;
}
if('-'!=s1[0] && '-'!=s2[0])
{
Multiply(s1,s2,strlen(s1),strlen(s2),ret);
return;
}
if('-'==s1[0] && '-'==s2[0])
{
Multiply(s1+1,s2+1,strlen(s1+1),strlen(s2+1),ret);
return;
}
i=1;
j=0;
if('-' != s1[0])
{
i=0;
j=1;
}
ret[0]='-';
Multiply(s1+i,s2+j,strlen(s1+i),strlen(s2+j),ret+1);
return;
}
int main() // a simple test
{
char a[N+2],b[N+2];//之所以加2,为‘-’站位,以及NULL
char ret[N+N+2];
gets(a);
printf("*");
gets(b);
printf("=");
int len1 = strlen(a);
int len2 = strlen(b);
LargeMutiply(a,b,ret);
puts(ret);
//gets 和 puts 是获得字符串的函数
system("pause");
return 0;
}