【C++】高精度方法求2的N次方
来源:互联网 发布:视频片头软件 编辑:程序博客网 时间:2024/05/16 08:38
2的N次方计算中结果可能超过long的范围
#include <iostream>#include <string>using namespace std;void mult(int m[],int a);void multipy(int n[],int m[]);int mini(int a);int main(void){const int max = 200;int m[max] = {0};m[max-1] = 2;int n[max] = {0};int a;cin >> a;if(a%2==1)n[max-1] = 2;else n[max-1] = 1;while(a>1){int s = mini(a);for(int i = 0;i<max-1;i++)m[i] = 0; m[max-1] = 2; mult(m,s);multipy(n,m);a -= s;}int z = 0;while(n[z]==0)z++;for(int i = z;i<max;i++)cout << n[i];}void mult(int *m,int a){const int max = 200;if(a==2){int y = 0;int e[max] = {0};for(int i = max-1;i>=0;i--){ for(int j = max-1;j>=0;j--) e[j-y] += m[i]*m[j];y++; }for(int i = max-1;i>0;i--){if(e[i]>9){ e[i-1] += e[i]/10; e[i] %= 10; }}for(int i = max-1;i>=0;i--)m[i] = e[i];}else{int y = 0;int e[max] = {0};for(int i = max-1;i>=0;i--){ for(int j = max-1;j>=0;j--) e[j-y] += m[i]*m[j];y++; }for(int i = max-1;i>0;i--){if(e[i]>9){ e[i-1] += e[i]/10; e[i] %= 10; }}for(int i = max-1;i>=0;i--)m[i] = e[i];mult(m,a/2); }}void multipy(int *n,int *m){const int max = 200;int y = 0;int e[max] = {0};for(int i = max-1;i>=0;i--){ for(int j = max-1;j>=0;j--) e[j-y] += n[i]*m[j];y++; }for(int i = max-1;i>0;i--){if(e[i]>9){ e[i-1] += e[i]/10; e[i] %= 10; }}for(int i = max-1;i>=0;i--)n[i] = e[i];}int mini(int a){int k = 1;while(k<=a)k *= 2;return k/2;}
0 0
- 【C++】高精度方法求2的N次方
- 【高精度】2的n次方
- 高精度计算,求一个小数的N次方(ACM1001)
- c语言求x的n次方
- OpenJudge百炼-2809-计算2的N次方-C语言-高精度计算
- 用c语言编写求n的k次方函数,用迭代和递归两种方法
- 用C语言求n的m次方代码
- K&R《C程序设计语言》p17:求m的n次方
- 求n次方的算法
- 求a的N次方
- 求T的N次方
- 求X的N次方
- 求n的k次方
- 求x的n次方
- 求m的n次方
- 求n的n次方最后一位
- 【9112】求2的n次方的精确值
- 2的N次方
- weg
- 年华屈指,往昔依梦,守望着一段心灵的时光
- Spring--quartz中cronExpression配置说明
- 2:Caesar 密码
- Android开发中实现多点触摸的方法
- 【C++】高精度方法求2的N次方
- 路径寻找问题 UVA 1499 - Gem And Prince
- Android界面设计之创建自定义的控件焦点顺序
- STM32的IAP
- 【恢复状态】第三届山东省ACM竞赛Problem J——Contest Print Server
- 高速缓冲寄存器(转自whowin博客)
- Template Code 无法使用 this.Host 报错
- 4:前缀中的周期
- 【C++】孙子问题,中国剩余问题