a:乘数
by 吴尚奇 Devil_box 2014/06
b:被乘数
s: 结果
#include<stdio.h>
#include<string.h>
void mult(char a[],char b[],char s[]);
int main()
{
char a[]="0";
char b[]="10";
char s[65];
int i=0;
mult(a,b,s);
while(*(s+i))
{
printf("%c",*(s+i));
i++;
}
return 0;
}
void mult(char a[],char b[],char s[])
{
int i,j,alen,blen;
int res[65][65]={0};//必须初始化为全零,下面是上三角形式的把位乘积相加
int k=0,sum=0,flag=0;
char result[65];
alen=strlen(a);// 被乘数长度
blen=strlen(b);//乘数长度
//将a每位数与b每位数相乘 保存在res
for(i=0;i<alen;i++)
for(j=0;j<blen;j++)
res[i][j]=(a[i]-'0')*(b[j]-'0');
for(i=alen-1; i >= 0; i--)//计算res右下半个三角数的和
{
for(j = blen-1; j >= 0; j--)
sum=sum+res[i+blen-j-1][j];//sum存储着几个数的和
result[k]=sum%10;
k++;
sum/=10;//存储进位信息
}
for(i=blen-2;i>=0;i--)//计算另一半的三角的和
{
for(j=0;j<=i;j++)
sum+=res[i-j][j];
result[k]=sum%10;
k++;
sum/=10;
}
if(sum) //最后一步有进位,要注意处理
{
result[k]=sum;
k++;
}
for(i=0;i<k;i++)
result[i]+='0';//转换为字符acsii码
for(i=k-1;i>=0;i--)
s[i]=result[k-i-1];
s[k]='\0';//方便以后处理,打印,哨兵的意思
while(1)//处理乘数或是被乘数是0,并让结果与a长度相同
{
if(strlen(s)!=strlen(a)&& s[0]=='0')
strcpy(s,s+1);
else
break;
}
}
by 吴尚奇 Devil_box 2014/06