这道题目是实质上就是高精度的乘法,虽然是带小数点的数多少次幂,但是开始我们需要将它变为整数进行求幂,然后再加上小数点,然后要考虑前导0,有效数位问题,做的时候要十分的小心

#include<iostream>
#include<string>
#include<cmath>
using namespace std; int origin[]; //输入不会超过6位
int num[]; //计算的结果
int backnum[]; int main()
{
string decim;
int ep,i,j,k,numpos,value,resid,count;
long fpos,efpos; //小数位和有效数位
int pointflag;
while(cin>>decim>>ep)
{
memset(origin,,sizeof(origin));
memset(num,,sizeof(num));
memset(backnum,,sizeof(backnum));
fpos=;numpos=,count=;
//将输入的数从后往前存到int数组中
for(i=decim.size()-;i>=;i--)
{
//记录第一个不是0的位置
if(!count&&decim[i]!='')
{
efpos=i;count=;
}
//记录小数点出现的位置
if(decim[i]=='.') fpos=decim.size()--i;
else{
//如果是数字,就存下来
origin[numpos]=decim[i]-'';
numpos++;
}
}
efpos=fpos-(decim.size()--efpos);
num[]=;
//进行ep次大整数乘法
for(int x=;x<ep;x++)
{
for(i=;i<;i++)
{
resid=;
for(j=;j<;j++)
{
value=num[j]*origin[i]+resid;
backnum[j+i]+=(value%);
if(backnum[j+i]>=)
{
backnum[j+i]=backnum[j+i]%;
backnum[j+i+]++;
}
resid=value/; }
//if(value==0&&resid==0) break;
}
memcpy(num,backnum,sizeof(num));
memset(backnum,,sizeof(backnum));
}
pointflag=;
fpos=fpos*ep;
efpos=efpos*ep;
//忽略前导0
for(i=;i>=;i--) if(num[i]) break;
//判断忽略前导0后,导致实际位数不够的时候填充0的情况
//即 0.4321 20
if(i+<fpos)
{
cout<<".";
for(int z=;z<fpos-i-;z++)
{
cout<<"";
}
efpos=efpos-(fpos-i-);
pointflag=;
}
for(j=i;j>=;j--)
{ if(j+==fpos)
{
if(efpos<=) break;
cout<<".";
pointflag=;
}
if(pointflag) pointflag++;
cout<<num[j];
//如果小数后的位数超过了有效位数,停止:即忽略后0
if(pointflag>(efpos)) break;
}
cout<<endl;
}
return ;
}

poj1001求幂的更多相关文章

  1. C# 高精度求幂 poj1001

    高精度求幂 public static char[] exponentiation(string a,int r) { ]; string b = ""; string c = a ...

  2. 算法:求幂(python版)

    分别用迭代方法和递归方法实现求幂迭代方法的时间复杂度为O(n),空间复杂度为O(1)递归方法1的时间复杂度为O(logn),空间复杂度为O(logn)递归方法2的时间复杂度为O(n),空间复杂度为O( ...

  3. 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模

    题目地址:http://ac.jobdu.com/problem.php?pid=1085 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k). ...

  4. 快速求幂(Quick Exponentiation)

    接触ACM没几天,向各路大神求教,听说ACM主要是研究算法,所以便开始了苦逼的算法学习之路.话不多说,RT所示,学习快速求幂. 在头文件<math.h>或是<cmath>中,d ...

  5. 高效求幂取余 算法,复杂度 log(n)

    做TopCoder SRM 576 D2 L3 题目时,程序有个地方需要对一个数大量求幂并取余,导致程序运行时间很长,看了Editoral之后,发现一个超级高效的求幂并取余的算法,之前做System ...

  6. NYOJ--102--次方求模(快速求幂取模)

    次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 求a的b次方对c取余的值   输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一 ...

  7. [leetcode]50. Pow(x, n)求幂

    Implement pow(x, n), which calculates x raised to the power n (xn). Example 1: Input: 2.00000, 10 Ou ...

  8. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: private static long pow(int x, int n){ if(n == 0) return 1; ...

  9. 二分求幂/快速幂取模运算——root(N,k)

    二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...

随机推荐

  1. Tsql查询执行顺序

    对于T-SQL编程,用得最广泛的,莫过于查询(Querying).要想写出高质量.高性能的查询语句,必须深入地了解逻辑查询处理. 一.逻辑查询处理的各个阶段 (5)SELECT DISTINCT TO ...

  2. Git批量删除

    Git批量删除 git的改动都需要stage过程后才能commit.当git中有大量改动时就需要能够批量操作在方便.改动分三种: modify: 有文件修改 add: 有文件增加 rm: 有文件删除 ...

  3. Web前端开发实用的Chrome插件

    Web前端开发实用的Chrome插件 越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录 ...

  4. nginx 开展对RT5350

    编译成功nginx的mips该平台后,,至make install生成的文件到一个角落rt5350文件系统. 必须指出的是,在,被放置在文件系统中需要安装文件夹和编译一致:候有release的文件夹, ...

  5. Robot Framework + appium 启动手机浏览器的两个方法(1)

    一.Open Browser启动 使用Selenium2Library的Open Browser方法,例子如下: browser=手机浏览器类型,如chrome 二.Open Application启 ...

  6. Swift 简简单单实现手机九宫格手势密码解锁

    原文:Swift 简简单单实现手机九宫格手势密码解锁 大家可以看到我之前的文章[HTML5 Canvas简简单单实现手机九宫格手势密码解锁] 本文是使用苹果语言对其进行了移植 颜色配色是拾取的支付宝的 ...

  7. 关于MariaDB和Mysql

    最近安装数据库的时候发现执行yum install mysql 命令时安装成了mariadb的数据库,它其实也是mysql的一个分支,完全兼容mysql 安装数据库: yum install mysq ...

  8. C语言库函数大全及应用实例四

    原文:C语言库函数大全及应用实例四                                    [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...

  9. 生产环境使用Nginx+uwsgi部署Django

    在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教 ...

  10. Model和Entity Framework

    Model和Entity Framework 上一节:ASP.NET MVC 5 入门教程 (4) View和ViewBag 下一节:ASP.NET MVC5 + EF6 入门教程 (6) View中 ...