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

来源:互联网 发布:易语言cc攻击源码 编辑:程序博客网 时间:2024/05/17 23:37
/*输入: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._size6 printf("%04d",_digit[i]);//输出:从高位向低位输出,除最高位外,需左补零,用%04d7 init();//设置乘数的时候,照样要先初始化8 重载*的时候由于要返回大整数,所以是BigInteger operator*(int iNum);*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXSIZE 10000typedef 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;}

0 0
原创粉丝点击