算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法

/*
输入:10
输出:3628800
高精度乘法:
关键:
1 设定初始值_size = 0;//记住,初始化的时候,应该置_size = 0,否则不能做,初始化不需要逐个设置,直接用memset(_digit,0,MAXSIZE或sizeof(_digit));
  memset与sizeof搭配,因为用的是数组
2 if(0 != iPass)//最后一次若要进位最后一次要判断循环体外是否需要进位
3 BigInteger ret;//这里应该是用返回值的结构体,与原有结构体的值相乘
4 for(int i = 0; i < _size ; i++)//循环的界限是_size,因为_size会自动变化,如果是定值的话,那么不管结果多大,都要有10000位
5 ret._digit[ret._size++] = iTemp % 10000;//这里用的是返回值自己的ret._size
6 printf("%04d",_digit[i]);//输出:从高位向低位输出,除最高位外,需左补零,用%04d
7 init();//设置乘数的时候,照样要先初始化
8 重载*的时候由于要返回大整数,所以是BigInteger operator*(int iNum);
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 10000

typedef struct BigInteger
{
	void init();
	void set(int iValue);
	void output();
	BigInteger operator*(int iNum);
	int _digit[MAXSIZE];
	int _size;
}BigInteger;



void BigInteger::init()
{
	//memset(_digit,0,MAXSIZE);
	memset(_digit,0,sizeof(_digit));
	/*
	for(int i = 0 ; i < MAXSIZE ; i++)
	{
		_digit[i] = 0;
	}
	*/
	_size = 0;//记住,初始化的时候,应该置_size = 0,否则不能做
}


//思路:乘的过程中,因为其实是要对数字与_digit中每一位进行相乘再进位
//乘的过程中,使用了一个临时变量作为返回值,来改变_digit的值
BigInteger BigInteger::operator*(int iNum)
{
	//BigInteger bin;
	//bin.init();
	BigInteger ret;//这里应该是用返回值的结构体,与原有结构体的值相乘
	ret.init();
	int iPass = 0;//设置进位
	//for(int i = 0 ; i < MAXSIZE ; i++)//循环的界限是_size,因为_size会自动变化,如果是定值的话,那么不管结果多大,都要有10000位
	for(int i = 0; i < _size ; i++)
	{
		//int iTemp = bin._digit[i]*iNum + iPass;
		int iTemp = _digit[i] * iNum + iPass;
		iPass = iTemp / 10000;
		//bin._digit[bin._size++] = iTemp % 10000;
		ret._digit[ret._size++] = iTemp % 10000;//这里用的是返回值自己的ret._size
	}
	
	if(0 != iPass)//最后一次若要进位
	{
		//bin._digit[bin._size++] = iPass;
		ret._digit[ret._size++] = iPass;
	}
	//return bin;
	return ret;
}



void BigInteger::output()
{
	bool isFirst = true;
	for(int i = _size - 1; i >= 0 ;i--)
	{
		if(!isFirst)
		{
			printf("%04d",_digit[i]);//输出:从高位向低位输出,除最高位外,需左补零,用%04d
		}
		else
		{
			printf("%d",_digit[i]);
			isFirst = false;
		}
	}
}


//设置初始值,否则1无法设置
void BigInteger::set(int iNum)
{
	init();//设置乘数的时候,照样要先初始化
	do{
		_digit[_size++] = iNum % MAXSIZE;
		iNum /= MAXSIZE;
	}while(iNum);
}

void process(int iNum)
{
	BigInteger bin;
	bin.set(1);
	for(int i = 1 ; i <= iNum ; i++)
	{
		bin = bin * i;
	}
	bin.output();
}

int main(int argc,char* argv[])
{
	int iNum;
	scanf("%d",&iNum);
	process(iNum);
	system("pause");
	return 0;
}

你可能感兴趣的:(算法竞赛入门)