大数乘法

#include <iostream>
#include <assert.h>
#include <string.h>

using namespace std;

char* resver (char* dest)       //字符串翻转
{
        char *start = dest;
        char *left = dest;
        char ch;

        while (*dest++)                 
                ; 
        dest -= 2;

        while (left < dest)
        {
                ch = *left;
                *left++ = *dest;
                *dest-- = ch;
        }
	  return (start);
}

char* maxmlu(char* num1, char* num2, char* num3 )       
{
      assert(num1 && num2 && num3);
	  if (num1[0] == '0' || num2[0] == '0' )
	  {
		  num3[0] = '0';
		  return num3;
	  }
	  int len1 = strlen(num1);
	  int len2 = strlen(num2);
	  resver(num1);
	  resver(num2);
	  memset(num3,0,sizeof(char)*127);
	  for (int i = 0; i<len1; i++)
	  {
		  for (int j = 0; j<len2; j++)
		  {
			  short temp1 = num1[i] - '0';
			  short temp2 = num2[j] - '0';
			  short temp3 = temp1*temp2;
			  num3[i+j] += temp3;
			  int count = 0;
			  while (num3[i+j+count] >9)       //如果大于9进位
			  {
				  num3[i+j+1+count] += (num3[i+j+count]/10);
				  num3[i+j+count] = num3[i+j+count]%10;
				  count++;
			  }
		  }
	  }

	  for (int i = 0; i<=len1+len2; i++)
	  {
		  num3[i] += '0';
	  }

	  num3[len1+len2] = '\0';
	  resver(num3);              //将3个字符数组翻转回来
	  resver(num1);
	  resver(num2);
      
	  int k = 0;
	  while (num3[k] == '0')      //计算前面是0的数目
		   k++;

	  memmove(num3,&num3[k],(126-k));   //将前面为0的部分覆盖      
	  return num3;

}

int main()
{
	char num1[64] = "";        //乘数最多为63位最后一位放'\0'
	char num2[64] = "";
	char ret[127]={0};         //最大的结果为126 最后一位放'\0'
	cout<<"输入乘数一:"<<endl;
	cin.getline(num1,64);
	cout<<"输入乘数二:"<<endl;
	cin.getline(num2,64);
	maxmlu(num1,num2,ret);
	cout<<num1<<"*"<<num2<<"="<<ret<<endl;
 	return  0;
}


用字符数组可以存放更多位数,

如1234*5678,就是用 8 *1234 + 70* 1234+ 600*1234 + 5000*1234 ,  8*1234 为8*4+8*30+8*200+8*1000,

所以将两个字符串翻转然后逐位相乘,如果大于10进位。 我写的这个程序没有考虑负数相乘,还需要改进

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏尔肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值