算法竞赛入门经典:第五章 基础题目选解 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
- 算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法
- 算法竞赛入门经典:第五章 基础题目选解 5.6 数组模拟高精度乘法
- 《算法竞赛入门经典》 第五章 基础题目选解
- 算法竞赛入门经典:第五章 基础题目选解 5.1WERTYU
- 算法竞赛入门经典:第五章 基础题目选解 5.2 Tex
- 算法竞赛入门经典:第五章 基础题目选解 5.3 周期串
- 算法竞赛入门经典:第五章 基础题目选解 5.4 小学生算术
- 算法竞赛入门经典:第五章 基础题目选解 5.7 6174问题
- 算法竞赛入门经典:第五章 基础题目选解 5.8 字母重排
- 算法竞赛入门经典:第五章 基础题目选解 5.9 Cantor数
- 算法竞赛入门经典:第五章 基础题目选解 5.10 因子和阶乘
- 算法竞赛入门经典:第五章 基础题目选解 5.11果园里的树
- 算法竞赛入门经典:第五章 基础题目选解 5.12多少块土地
- 算法竞赛入门第五章(竞赛题目选讲)解析:
- 【索引】算法竞赛入门经典-第5章 基础题目选解
- 算法竞赛入门经典高精度运算推荐题目
- 算法竞赛入门经典 第五章 字符串
- 算法竞赛入门经典 第五章 6174
- NGUI研究院之UISprite和UITexture浅谈(十二)(图片大小优化)
- GCD的使用与理解(2)
- double-array-trie双数组trie树原理解析和数据构建过程
- JAVA编程之static、final修饰符
- Linux图形界面与字符界面切换
- 算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法
- 最长公共子序列(动态规划)
- Hdu oj 1233 还是畅通工程
- swift-03-数据类型转换
- WIN7下PS/2等键盘失灵无法使用的解决办法--实测有效
- Attribute xx is only used in API level xx and higher (current min is xx)的解决方法
- 例题6.7 冰人 HDU2936
- POJ 3264 Balanced Lineup
- 小问题:data too long for column 'picture' at row 1