这道题目是实质上就是高精度的乘法,虽然是带小数点的数多少次幂,但是开始我们需要将它变为整数进行求幂,然后再加上小数点,然后要考虑前导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. Swift入门教程:基本语法(五)

    断言 断言是一种实时检测条件是否为true的方法 如果条件为true,那么代码继续执行 如果条件为false,就抛出错误信息,直接终止程序的运行   断言的用法 使用全局的assert函数 passe ...

  2. iframe的各项參数

    iframe的各项參数: <iframe src="test.jsp" width="100″ height="50″ frameborder=" ...

  3. Vim实用小技巧

    Vim实用小技巧 一些网络上质量较高的Vim资料 从我07年接触Vim以来,已经过去了8个年头,期间看过很多的Vim文章,我自己觉得非常不错,而且创作时间也比较近的文章有如下这些. Vim入门 目前为 ...

  4. 多线程之线程池Executor应用

    JDK1.5之后,提供了自带的线程池,以便我们更好的处理线程并发问题. Executor类给我提供了多个线程池创建的方式: 创建固定的线程池 Executors.newFixedThreadPool( ...

  5. js前端分页之jQuery

    锋利的js前端分页之jQuery 大家在作分页时,多数是在后台返回一个导航条的html字符串,其实在前端用js也很好实现. 调用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比 ...

  6. loadrunner监控度量项及中文解释

    1. Number of Concurrent Users (NCU) 并发用户数 – 在指定时刻,系统观察到的并发用户连接数. 2. Request Per Second (RPS) 每秒处理请求数 ...

  7. 一个只能用在Win下的密码验证函数(显示星号,可删除)

    以前做小程序时图好玩在网上找的代码.输入的密码会以星号显示出来,并且输入错了可以删除.因为用了专有库函数,所以只能在Windows平台使用,少用为好,不过可能还有点用.嗯…就这样了 #include ...

  8. Spring IOC之 使用JSR 330标准注解

    从Spring 3.0开始,Spring提供了对 JSR 330标准注解的支持.这些注解可以喝Spring注解一样被扫描到.你只需要将相关的Jar包加入到你的classpath中即可. 注意:如果你使 ...

  9. The Native POSIX Thread Library for Linux - 设计文档

    nptl-design

  10. (UML两个汇总)九种图。

    最后总结UML关系,有明确的关系,现在让我们总结一下UML九图..图往往比文字要直观,因此,当我们开发软件.文件必须是不可或缺的人物,. 以下我将这九种图分了一下: 我们还能够将这九种图分为静态图和动 ...