C语言字符数组实现两个大数相乘

在这里插入图片描述
一个长度为m和一个长度为n的数相乘,乘积的长度一定小于m+n。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char x[50],y[50],r[100];
    int sum,add,t,m,n,i,j;
    while(scanf("%s",x)>0)
    {
       scanf("%s",y);
       for(i=0;i<100;i++)//初始化使得r字符串中均为‘0’,不是初始化为空
       {
          r[i]='0';
       }
        m=strlen(x);
        n=strlen(y);
        for(i=m-1;i>=0;--i)
        {
            add=0;
            for(j=n-1;j>=0;--j)
            {
                t=(x[i]-'0')*(y[j]-'0');//注意t是int类型,不能字符直接相乘
                sum=r[i+j+1]+add+t%10-'0';
                r[i+j+1]='0'+sum%10;
                add=t/10+sum/10;

            }
            r[i]+=add;
        }

        for(i=0;r[i]=='0';i++);//把前面是0的消去,注意分号
        while(i<=m+n-1)
        {
            printf("%c",r[i]);
            i++;
        }
        printf("\n");

    }
    return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  char x[50],y[50];
  int i,j,m,n,add,k;
  int *ans;//结果是int类型
   while(scanf("%s",x)>0)
    {
       scanf("%s",y);
      m=strlen(x);
      n=strlen(y);
      k=m+n;
     ans=(int*)malloc(sizeof(int)*(k));
      memset(ans,0,sizeof(int)*k);
      for(i=m-1;i>=0;i--)
      {
          for(j=n-1;j>=0;j--)
          {
              ans[(m-1-i)+(n-1-j)]+=(x[i]-'0')*(y[j]-'0');
          }
      }
      for(i=0;i<m+n-1;i++)
      {
          add=ans[i]/10;
          ans[i]=ans[i]%10;
          ans[i+1]+=add;
      }
      for(i=m+n-1;ans[i]==0;i--);
      while(i>=0)
      {
          printf("%d",ans[i]);
          i--;
      }
      printf("\n");
  }

    return EXIT_SUCCESS;
}

发布了9 篇原创文章 · 获赞 0 · 访问量 224

猜你喜欢

转载自blog.csdn.net/zmsjylyf/article/details/105023758