您的位置:首页 > 编程语言 > C语言/C++

两个大数相乘的C++实现

2012-04-22 19:41 751 查看
#include <iostream>
#include <string.h>
#include <cassert>

class BigIntegerMultiplier
{
private:
/// 判断两个字符串可不可以表示一个整数
static inline bool isNumber(const char* s)
{
if(0 == s || '\0' == *s++)
return false;
while('\0' != *s)
{
if(*s < '0' || *s > '9')
return false;
++s;
}
return true;
}
/// 判断字符s是否为一个整数
static inline bool isNumber(char s)
{
return s > '9' || s < '0' ? false : true;
}

/**
* 将一个数num加到另一个大数上result的pos位置上
* 函数内部使用递归来处理进位的问题
* */
static void add(char num, char* result, unsigned int pos)
{
if(!isNumber(num)) return;

int sum = (num - '0' ) + (result[pos] - '0');
if(sum < 10)
{
result[pos] = sum + '0';
return;
}
result[pos] = '0' + sum - 10;
add('1', result, pos - 1);
}

/**
* 将一个小数num(0到9)与大数s相乘,并把结果保存到result中。result的startPos位置表示result的个位所在的位置。
* */
static void multiply(const char* s, char num, char* result, unsigned int startPos)
{
if(!isNumber(s) || !isNumber(num)) return;
unsigned int len = strlen(s);
unsigned int j = len - 1;
int number(num - '0');
while (j >= 0)
{
int sum = (s[j] - '0') * number;
if(sum < 10)
{
add(sum + '0', result, startPos);
}
else
{
add(sum % 10 + '0', result, startPos);
add(sum / 10 + '0', result, startPos - 1);
}
if(0 == j)
return;
--startPos;
--j;
}
}

//// 剔除数s中最高位为0的部分。
static void deleteZeros(char* s)
{
if (0 == s || *s == '\0' || *s != '0')
{
return;
}

// the string s represents a zero number.
if(*s == '0' && *(s + 1) == '\0')
{
return;
}

char* temp = s;
while(*temp == '0' && *temp != '\0')
{
++temp;
}
if(*temp == '\0')
{
s[1] = '\0';
}

while(*temp != '\0')
{
*s++ = *temp++;
}

*s = *temp; // '\0'
}

public:
/**
* 程序的入口。
* **/
static char* multiply(const char* s1, const char* s2)
{
if(!isNumber(s1) || !isNumber(s2))
return 0;
char* result = new char[strlen(s1) + strlen(s2) + 1];
if(0 == result)
return 0;
memset(result, '0', sizeof(char) * (1 + strlen(s1) + strlen(s2)));
result[strlen(s1) + strlen(s2)] = '\0';
unsigned int len(strlen(s2));
unsigned int j = len - 1;
unsigned int resStartPos = strlen(s1) + strlen(s2) - 1;
while(j >= 0)
{
multiply(s1, s2[j], result, resStartPos);
if(0 == j)
break;
--j;
--resStartPos;
}

deleteZeros(result);
return result;
}

};

//// 打印数字
void printNumber(const char* s)
{
if (0 == s)
{
return;
}

while(*s != '\0')
{
std::cout << *s++;
}
}

int main(int argc, char** argv)
{
const char* number1 = "123456789";
const char* number2 = "123456789";
char* result = BigIntegerMultiplier::multiply(number1, number2);

assert(0 != result);
/// 输出结果
printNumber(number1);
std::cout << " * ";
printNumber(number2);
std::cout << " = ";
printNumber(result);
std::cout << std::endl;

delete[] result, result = 0;
return 0;
}


程序输出结果:123456789 * 123456789 = 15241578750190521
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: