现在的位置: 首页 > 综合 > 正文

算法——大数乘大数

2018年04月19日 ⁄ 综合 ⁄ 共 1077字 ⁄ 字号 评论关闭

a:乘数

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

抱歉!评论已关闭.