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

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

2018年05月08日 ⁄ 综合 ⁄ 共 2209字 ⁄ 字号 评论关闭

 

#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

 

抱歉!评论已关闭.