Exponentiation
Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 175340   Accepted: 42341

Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

Hint

If you don't know how to determine wheather encounted the end of input: 
s is a string and n is an integer

C++

while(cin>>s>>n)

{

...

}

c

while(scanf("%s%d",s,&n)==2) //to see if the scanf read in as many items as you want

/*while(scanf(%s%d",s,&n)!=EOF) //this also work */

{

...

}

Source

大意:

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。

Input

T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。

Output

对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。

解题思路:

(1)pow精度不够

函数原型:double pow( double x, double y );

头文件:math.h/cmath(C++中)

功能:计算x的y次方

返回值:x不能为负数且y为小数,或者x为0且y小于等于0,返回幂指数的结果。

 #include<math.h>
#include<stdio.h>
int main()
{
double x=2.0,y=3.0;
printf("%lf raised to %lf is %lf\n",x,y,pow(x,y));
return ;
}

(2)模拟乘法运算过程

  必须自己模拟乘法运算过程,进行高精度的运算。

  题目把输入的数限制在了6位,即只有5位数字,方便了我们解题。

  我们将输入数字,以字符串形式读入,找到小数所在的位数,计算出结果应包含的小数的位数,比如说第一个算式“95.123 12”的小数的位数应该有3*12位。

  解题的关键在于进行数据的处理,即模拟整数乘法,使用倒序数组,为什么使用倒序数组呢?我们模拟一下竖式乘法过程,例如:123*123:

  1  2  3

 x         3

——————

  3  6  9

先用个位乘被乘数;

  1  2  3

 x     2

——————

  2  4  6

  +    3  6   9

——————

  2  7  12  9

在用十位乘被乘数,并相加。

对大于10的进行进位:2  7  12  9 ==》 2  8  2  9

  1  2  3

 x  1

——————

  1  2  3

 +     2  8  2  9

————————

  1  4  11 2  9

在用百位乘被乘数,并相加。

对大于10的进行进位:1  4  11 2  9 ==》 1  5  1  2  9

  从上面的乘法竖式中,我们是向前进位,由于我们不知道最后得到的数据的位数,所以采用倒序存储,向后进位;从0位开始乘,结果也从0位开始存,非常方便。这样得出的结果也是倒序的。

  为了计算方便,我们不把数字多余的0去掉,而是在最后判断小数点的位置,然后输出该输出的数位。

  每次乘法,都是用题目给的r乘上你上一次得出的结果,如果是第一次计算,那么就是r,计算的结果直接加到一个初始化为0的250大小的数组里面,注意是加。乘法的过程很容易模拟出来,就是让乘数让乘数第一位把你的结果的所有位乘一遍,然后再让第二位乘,注意加进数组时,有一个偏移量,乘法竖式都是这么写的,大家体会下。

  开一个250的数组m存储结果,并且开一个250的数组jieguo存储中间结果,并且需要一个长度为6的int型数组存储输入的String类型的数据r。

  输出结果时要小心,因为数组中存储的数位是倒序的,且没有小数点,需要计算从两边向中间的小数点方向第一个不为0数的位置。

 #include<iostream>
#include<cstring>
#include<string>
#define MAX 250
using namespace std;
int main()
{
string r;//底数
int n,dian;
short Chengshu[];
short m[MAX],jieguo[MAX];
while(cin>>r>>n)
{
for(int i=;i<=MAX;i++) {m[i]=jieguo[i]=;}//初始化
for(int j=;j<;j++) {Chengshu[j]=;}
dian = ;//小数点位置
size_t pos = r.find(".");
if(pos != string::npos) dian = (-pos)*n;
for(int i=,j=;i>=;i--)
{//注意此处进行倒序存储
if(r[i] != '.') {
Chengshu[j] = m[j] = jieguo[j] = r[i]-'';
//此处要给m[]赋值,当n=1时直接输出
j++;
}
}
while(n>=)//当乘幂大于等于2的时候,等于1可直接处理0输出
{
for(int i=;i<MAX;++i) m[i]=;
for(int i=;i<;i++)
{//chengshu[i]
for(int j=;j<MAX;j++)
{
if(Chengshu[i]==) break;
else{
m[i+j] += Chengshu[i]*jieguo[j];
//对>9 的进行处理
for(int t=i+j;m[t]>;++t)//处理进位
{
m[t+]+=m[t]/;
m[t]=m[t]%;
}
}
}
}
//更新被乘数
for(int k=;k<MAX;k++)
{
jieguo[k] = m[k];
}
n--;
}
int first = -;
for(int i=MAX-;i>=dian;i--)
{//从右向左查找第一个不为0的位
if(m[i]>)
{
first = i;break;
}
}
int last = dian;
for(int j=;j<dian;j++)
{//从左向右查找小数点后第一个不为0的位
if(m[j]>) {
last = j;break;
}
} if(first != -)//整数位不全为0
{
for(int k=first;k>=dian;k--)
cout<<m[k];
} if(last != dian)//有小数位
{
cout<<".";
for(int k=dian-;k>=last;k--)
cout<<m[k];
}
cout<<endl;
}
return ;
}

java中有一个类 :java.math.BigDecimal

 import java.io.*;
import java.util.*;
import java.math.BigDecimal; public class Main
{
public static void main(String args[])throws Exception
{
Scanner cin=new Scanner(System.in);
while(cin.hasNext())
{
BigDecimal r=cin.nextBigDecimal();
int n=cin.nextInt();
r=r.pow(n).stripTrailingZeros();//去掉小数点后面的零
String m_string=r.toPlainString();//不带指数段的字符串表示形式
if(m_string.charAt(0)=='0')
m_string=m_string.substring(1);
System.out.println(m_string);
}
}
}
 
 
 

Exponentiation(求高精度幂)的更多相关文章

  1. Poj.Grids 2951 浮点数求高精度幂

    2951:浮点数求高精度幂 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方. ...

  2. 求高精度幂(java)

    求高精度幂 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要 ...

  3. 【ACM】求高精度幂

    题目来源:http://poj.org/problem?id=1001&lang=zh-CN 求高精度幂 Time Limit: 500MS   Memory Limit: 10000K To ...

  4. poj 1001 求高精度幂(Java, BigDecimal, pow, hasNext, stripTrailingZeros, toPlainString)

    求高精度幂 Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 180325   Accepted: 43460 Descripti ...

  5. poj 1001 求高精度幂

    本题的测试用例十分刁钻,必须要考虑到很多的细节问题,在这里给出一组测试用例及运行结果: 95.123 12 548815620517731830194541.899025343415715973535 ...

  6. 求高精度幂(poj1001)

    Description Problems involving the computation of exact values of very large magnitude and precision ...

  7. 【PKU1001】Exponentiation(高精度乘法)

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 ...

  8. HDU 1402 A * B Problem Plus (FFT求高精度乘法)

    A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. 使用java求高精度除法,要求保留N位小数

    题目要求是高精度除法,要求保留N位小数(四舍五入),并且当整数部分为0时去除0的显示 import java.math.BigDecimal; import java.util.Scanner; pu ...

随机推荐

  1. TP5 用cron实现linux定时任务

    TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; use think\Controller; use think\fa ...

  2. idou老师教你学Istio05: 如何用Isito实现智能路由配置

    要介绍istio请求路由,我们不由得先从pilot 和 envoy开始谈起. 在服务网格中,Pilot管理和配置所有的envoy实例.在pilot中,你几乎可以配置所有的关于流量导向规则及其他故障恢复 ...

  3. Python&Selenium自动化测试之PO设计模式

    一.摘要 Page Object模式,后面简称PO,他是一种设计思想,在上一章节中,曾经列举了一些在编写自动化测试过程中随着代码量的增加导致的大量代码难以维护.难以扩展.可读性极差等灾难性的事件:那么 ...

  4. bat 判断变量字符串中是否包含字符串

    bat 判断变量字符串中是否包含字符串 @echo off rem way 1 set str=machine-order-service set matchStr=orderd echo %str% ...

  5. Eclipse创建Servers没有Apache选项

    help->install new software加入网址是http://download.eclipse.org/releases/Neon,最后一个是你eclipse的版本.得到一系列的插 ...

  6. python pip 出现locations that require TLS/SSL异常处理方法

    python pip 出现locations that require TLS/SSL异常处理方法 转载 郑才华 发布于2018-03-24 21:41:16 阅读数 51844 收藏 展开 最近在r ...

  7. c语言第一次作业1

    第一次作业 一 你对软件工程或者计算机科学与技术专业的了解是什么? 软件工程是一门研究用工程化方法构建和维护有效的,实用的和高质量的软件的学科,涉及程序语言设计,数据库,软件开发工具,系统平台,设计模 ...

  8. Oracle 11 安装 提示环境不满足最低要求解决方案

    在 Oracle 安装包 中,找到 stage 文件夹 切入,再找到 cvu 文件夹,找到 cvu_prereq.xml 文件 ,进行编辑 新增 这一块内容. <OPERATING_SYSTEM ...

  9. 洛谷P1372 又是毕业季I【数论】

    题目:https://www.luogu.org/problemnew/show/P1372 题意: 在1~n之中找k个数,使得他们的最大公因数最大. 思路: 假设ans是答案,说明选择的k个数分别是 ...

  10. HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5

    思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...