微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数相乘

这个题很坑,有几种情况要测试

1.如果有一个乘数为空,则返回-1

2,如果结果为0,返回的字符串不能为空,要为“0”;

#include "oj.h"


/*******************************************************
 Prototype    : multiply
 Description  : 两个任意长度的长整数相乘,输出结果
 Input Param  : 
                const std::string strMultiplierA  乘数A
                const std::string strMultiplierB  乘数B
 Output      : 
                std::string strRst            乘法结果
 Return Value : 
                int                      0  正确  
                                        -1  异常
********************************************************/
int multiply (const std::string strMultiplierA,const std::string strMultiplierB,std::string &strRst) 
{

 /* 在这里实现功能 */
 string chengshua = strMultiplierA;
 string chengshub = strMultiplierB;
 int a = chengshua.length();
 int b = chengshub.length();
 int strRst_length = 0;
 int c = (a+1)*(b+1);
 int *p = new int[c];
 int *pa = new int[a];
 int *pb = new int[b];
 if ((a == 0) || (b == 0))//测试是否有乘数为空
 {
  return -1;
 }
 for (int i = 0; i != c; i++)
 {
  p[i] = 0;
 }
 for (string::size_type index = 0; index !=  chengshua.length(); index++) //把乘数放到数组中
 {
  pa[a-1-index] = chengshua.at(index) - '0';
 }
 for (string::size_type index = 0; index != chengshub.length(); index++)
 {
  pb[b-1-index] = chengshub.at(index) - '0';
 }
 for (int temp_b = 0; temp_b != b; temp_b++)  //每个位循环相乘
 {
  for (int temp_a = 0; temp_a != a; temp_a++)
  {
   p[temp_a+temp_b] += pa[temp_a]*pb[temp_b]; 
   for (int x = temp_a + temp_b; x != c ; x++)
   {
    if (p[x]/10 == 0)
    {
     break;
    }
    else
    {
     p[x+1] = p[x+1] + p[x]/10;
     p[x] = p[x]%10;
    }
   }
  }
 }

 while (c-- > 0)  //判断结果有几位
 {
  if (p[c] != 0)
  {
   strRst_length = c + 1;
   break;
  }
 }
 char ch;
 for (int i = strRst_length - 1; i >= 0 ; i--)  //把结果放入字符串中
 {
  ch = p[i] + '0';
  strRst.push_back(ch);
 }
 if (strRst.empty())//如果结果为0,则输出字符串为“0”
 {
  strRst = "0";
 }

 return 0;
}

测试正确

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐