poj1001求幂
这道题目是实质上就是高精度的乘法,虽然是带小数点的数多少次幂,但是开始我们需要将它变为整数进行求幂,然后再加上小数点,然后要考虑前导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求幂的更多相关文章
- C# 高精度求幂 poj1001
高精度求幂 public static char[] exponentiation(string a,int r) { ]; string b = ""; string c = a ...
- 算法:求幂(python版)
分别用迭代方法和递归方法实现求幂迭代方法的时间复杂度为O(n),空间复杂度为O(1)递归方法1的时间复杂度为O(logn),空间复杂度为O(logn)递归方法2的时间复杂度为O(n),空间复杂度为O( ...
- 九度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). ...
- 快速求幂(Quick Exponentiation)
接触ACM没几天,向各路大神求教,听说ACM主要是研究算法,所以便开始了苦逼的算法学习之路.话不多说,RT所示,学习快速求幂. 在头文件<math.h>或是<cmath>中,d ...
- 高效求幂取余 算法,复杂度 log(n)
做TopCoder SRM 576 D2 L3 题目时,程序有个地方需要对一个数大量求幂并取余,导致程序运行时间很长,看了Editoral之后,发现一个超级高效的求幂并取余的算法,之前做System ...
- NYOJ--102--次方求模(快速求幂取模)
次方求模 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一 ...
- [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 ...
- 求幂运算、多项式乘法及Horner法则的应用
一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: private static long pow(int x, int n){ if(n == 0) return 1; ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...
随机推荐
- 前端学习笔记(zepto或jquery)——对li标签的相关操作(一)
对li标签的相关操作——点击li标签进行样式切换的两种方式 Demo演示: 1 2 3 4 // 详解: 第一种方式(以ul为基础): $("ul").bind("cli ...
- DES加密深度优化——随机生成加密字符串
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.但该算法一旦密钥固定,加密的字符串也就随之固定,这不利于数据存储安全.而且用该方法加密后有一个 ...
- Google软件构建工具Bazel
转载Google软件构建工具Bazel FAQ 本文是我的翻译,原文在这里.欢迎转载,转载请注名本文作者和原始链接注:如果想了解Bazel的原理,可以看看我之前翻译的Google Blaze原理及使用 ...
- C#操作Word文档(加密、解密、对应书签插入分页符)
原文:C#操作Word文档(加密.解密.对应书签插入分页符) 最近做一个项目,客户要求对已经生成好的RTF文件中的内容进行分页显示,由于之前对这方面没有什么了解,后来在网上也找了相关的资料,并结合自己 ...
- Windows服务之启动、停止、暂停、继续
原文:Windows服务之启动.停止.暂停.继续 Windows服务之启动.停止.暂停.继续 2011-11-09 15:07:37 我来说两句 收藏 我要投稿 [字体:小 大] ...
- UiAutomator源码分析之UiAutomatorBridge框架
上一篇文章<UIAutomator源码分析之启动和运行>我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge ...
- Appium Server 源码分析之启动运行Express http服务器
通过上一个系列Appium Android Bootstrap源码分析我们了解到了appium在安卓目标机器上是如何通过bootstrap这个服务来接收appium从pc端发送过来的命令,并最终使用u ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- GitHub上整理
GitHub上整理 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应 ...
- 【硬件】DELLserver硬件监控和DELL系统管理工具OMSA介绍
1.1.1. DELLserver硬件监控和DELL系统管理工具OMSA介绍 本文介绍了利用使用Nagios和OMSA显示器DELLserver硬件健康状况,Nagios监控的方式是NRPE模式,须要 ...