/*
输入: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;
}
算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法
最新推荐文章于 2022-03-29 09:49:14 发布