[ACM Steps]2.3.2 Exponentiation 大数乘法 小数的n次幂
来源:互联网 发布:安卓主题知乎 编辑:程序博客网 时间:2024/05/01 18:20
题目:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=3&problemid=2
求一个大数(小数或整数)的n 次幂。
思路:
1、大数乘法
首先,将两个操作数逆转存放。
然后,将第i位和第j位相乘的结果累加存入得数的第i+j位。
再处理进位,把进位加到下一位。
最后确定得数的位数。一个A位数和一个B位数相乘的结果最长为A+B位。从得数的A+B位开始,判断是否为0,若为0 ,则得数长度减1.。
Number mul(Number A,Number B){Number C;int carry;for(int i = 0;i < A.len;i++)for(int j = 0;j < B.len;j++){C.num[i + j] += (A.num[i] * B.num[j]);}int len = A.len + B.len ;carry = 0;for(int i = 0;i < len;i++){C.num[i] += carry;if(C.num[i] > 9){carry = C.num[i] / 10;C.num[i] = C.num[i] % 10;}else carry = 0;}while(C.num[len - 1] == 0){len--;}C.len = len;return C;}
整数的n次幂必定为整数,小数的N次幂则为小数(0次幂除外),所以要确定得数小数点位置。
一个有m位小数的数的n次幂,得数有m*n位小数。
消除后置0
在处理输入数时,先判断是否存在小数点。若存在,删除小数点最后的0。
然后求出小数点后的数字位数,即小数的位数。
在完成乘法后,可能需要在小数点后补0
根据得数的长度与得数小数位数比较,
若小数位数 >= 得数长度,小数点在最前面,小数点后需要补小数点位数 - 得数长度个0.
否则,则在得数中的小数点位置插入小数点。
#include <stdio.h>#include <string.h>struct Number{int num[200];int len;Number(){memset(num,0,sizeof(num));len = 0;}};Number mul(Number A,Number B){Number C;int carry;for(int i = 0;i < A.len;i++)for(int j = 0;j < B.len;j++){C.num[i + j] += (A.num[i] * B.num[j]);}int len = A.len + B.len ;carry = 0;for(int i = 0;i < len;i++){C.num[i] += carry;if(C.num[i] > 9){carry = C.num[i] / 10;C.num[i] = C.num[i] % 10;}else carry = 0;}while(C.num[len - 1] == 0){len--;}C.len = len;return C;}int main(){int n,len;char R[200];Number A;Number Ans;int decimalPoint;bool decimalPointFlag;while(scanf("%s %d",R,&n) != EOF){len = strlen(R);decimalPoint = 0;decimalPointFlag = false;A.len = 0;for(int i = 0;i < len;i++)//是否为小数if(R[i] == '.')decimalPointFlag = true;if(decimalPointFlag)while(R[len -1] == '0')//去除小数点后最后多余的0len--;for(int i = len - 1; i >= 0 ; i--){if(R[i] == '.')decimalPoint = len - i - 1;//小数点后数字的位数else A.num[A.len++] = R[i] - '0';}Ans.num[0] = 1;Ans.len = 1;decimalPoint *= n;while(n--){Ans = mul(Ans,A);}if(Ans.len == 0)printf("%c", '0');if(decimalPoint >= Ans.len)//小数点位数 >= 得数长度时,要在最前面补小数点{printf("%c", '.');for(int i = 0;i < decimalPoint - Ans.len;i++)//得数长度小于小数点位数时,要补0printf("%c", '0');}for(int i = Ans.len - 1;i >= 0;i--){printf("%d", Ans.num[i]);if(decimalPoint != 0 && i == decimalPoint)printf("%c", '.');}printf("\n");}return 0;}
0 0
- [ACM Steps]2.3.2 Exponentiation 大数乘法 小数的n次幂
- (hdu 2.3.2)Exponentiation(大数:求R的n次幂)
- ACM--steps--dyx--2.3.2--Exponentiation
- 大数的N次幂
- 大数乘法 748 - Exponentiation
- hdoj 1063 Exponentiation 【大数精准次幂】
- [ACM Steps]2.2.8 Big Number 求N!位数 大数N阶乘的位数
- acm steps(小数化分数2)
- hdu 1063 Exponentiation 大数乘法
- HDU 1063 Exponentiation(大数乘法)
- ACM--steps-2.3.1--大数相加
- uva 748 - Exponentiation 带小数点的大数乘法
- POJ 1001 Exponentiation 无限大数的指数乘法 题解
- 大数算法n次幂
- 【ACM Steps】N!Again
- hdu 1063 Exponentiation (高精度小数乘法)
- poj1001 Exponentiation 小数幂
- 杭电ACM OJ 1042 N! java大数乘法BigInteger
- http://busumen.com/laian/11915.html 021agjha
- Android TextView点击效果
- SQLServer 2008打开问题——连接不到local
- My97DatePicke日期控件学习
- http://busumen.com/wenda/ 021fvahw
- [ACM Steps]2.3.2 Exponentiation 大数乘法 小数的n次幂
- CUDA矩阵相乘
- 实习篇---第四十四天
- 计算机图形学资料整合
- Unity3D技术之优化图形性能渲染统计信息窗口浅析
- PHP入门基础学习篇(二)
- 原发性癫痫的治疗方法 022uubgp
- linux模块编程(一)——加载你的模块
- HDU 5164 Matching on Array AC自动机套map