[POJ 1001] Exponentiation C++解题报告 JAVA解题报告
| Time Limit: 500MS | Memory Limit: 10000K | |
| Total Submissions: 126980 | Accepted: 30980 |
Description
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
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
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
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 */
{
...
} 翻译:
| Time Limit: 500MS | Memory Limit: 10000K | |
| Total Submissions: 126980 | Accepted: 30980 |
Description
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
Input
Output
解决思路
这是一道高精度的题,主要是处理前导0和末尾0的时候有点麻烦。例如100.00可能会处理成1。
源码
C++解题
/*
poj 1001
version:1.0
author:Knight
Email:S.Knight.Work@gmail.com
*/ #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<memory.h>
using namespace std; char Result[];//存R^N的结果 //大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中
void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result);
//剔除实数尾部的无效0或小数点
void CutInsignificantTail(char* StrR);
//计算小数点在实数中的位数
int CountPointIndex(char* StrR);
//删除实数中的小数点,PointIndex为小数点在实数中从右向左数的第几位
void DeletePoint(char* StrR, int PointIndex); int main(void)
{
char StrR[];//R对应的字符串
int N;
int i;
int PointIndex = ;//记录小数点在实数中从右向左数的第几位,如1.26在第3位,4在第0位 while(scanf("%s%d", StrR, &N) != EOF)
{
memset(Result, , ); CutInsignificantTail(StrR); PointIndex = CountPointIndex(StrR); DeletePoint(StrR, PointIndex); strcpy(Result, StrR); for (i=; i<=N; i++)
{
HigRealMul(Result, StrR, Result);
} int Len = strlen(Result); if (Len -(PointIndex - ) * N < )
{
printf(".");
for (i = Len - (PointIndex - ) * N; i<; i++)
{
printf("");
}
} for (i=; i<Len; i++)
{
//输出小数点
if (i == Len -(PointIndex - ) * N)
{
printf(".");
}
printf("%c", Result[i]);
}
printf("\n");
//printf("%s\n", Result);
//printf("%d\n", PointIndex);
}
return ;
} //大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中
void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result)
{ char TmpResult[];
int i,j;
int k = -;//控制TmpResult[]下标
int FirLen = strlen(FirMultiplier);
int SecLen = strlen(SecMultiplier); memset(TmpResult, '', ); //模拟乘法运算
for (i=SecLen-; i>=; i--)
{
k++; int FirMul;
int SecMul = SecMultiplier[i] - '';
int Carry;//进位 for (j=FirLen-; j>=; j--)
{
FirMul = FirMultiplier[j] - '';
TmpResult[k + FirLen - - j] += FirMul * SecMul % ;
Carry = FirMul * SecMul / + (TmpResult[k + FirLen - - j] - '') / ;
TmpResult[k + FirLen - - j] = (TmpResult[k + FirLen - - j] - '') % + '';
TmpResult[k + FirLen - j] += Carry;
}
} //防止某一位的值超过9
for (k=; k<; k++)
{
TmpResult[k + ] += (TmpResult[k] - '') / ;
TmpResult[k] = (TmpResult[k] - '') % + '';
}
//将设置字符串结束符
for (k=; k>=; k--)
{
if ('' != TmpResult[k - ])
{
TmpResult[k] = '\0';
break;
}
} //将临时存储的答案TmpResult倒转变成我们熟悉的方式,存到Result中
for (i=strlen(TmpResult)-,j=; i>=; i--,j++)
{
Result[j] = TmpResult[i];
}
Result[j] = '\0'; } //剔除实数尾部的无效0或小数点
void CutInsignificantTail(char* StrR)
{
int i;
int PointIndex = CountPointIndex(StrR);
int Len = strlen(StrR); if ( == PointIndex)
{
if ('.' == StrR[Len - ])
{
StrR[Len - ] = '\0';
} return;
} for (i=Len-; i>Len--PointIndex; i--)
{
if ('' == StrR[i] || '.' == StrR[i])
{
StrR[i] = '\0';
}
else
{
return ;
}
}
} //计算小数点在实数中的位数
int CountPointIndex(char* StrR)
{
int i;
int Index = ; for (i = strlen(StrR); i>=; i--)
{ if ('.' == StrR[i])
{
break;
}
else
{
Index++;
}
} if (- == i)
{
Index = ;
} return Index; } //删除实数中的小数点
void DeletePoint(char* StrR, int PointIndex)
{
int i;
int Len = strlen(StrR); for (i=strlen(StrR)-PointIndex; i<Len; i++)
{
StrR[i] = StrR[i+];
}
}
JAVA解题:
import java.io.*;
import java.util.*;
import java.math.*; public class Main1001 { /**
* @param args
*/
public static void main(String[] args) {
Scanner cinScanner = new Scanner(System.in); while (cinScanner.hasNextBigDecimal()) {
BigDecimal r = cinScanner.nextBigDecimal();
int n = cinScanner.nextInt(); BigDecimal answerBigDecimal = r.pow(n);
/*
* stripTrailingZero();去除小数后边的0,例如16.000000使用这个方法后,就变成了16
*/
answerBigDecimal = answerBigDecimal.stripTrailingZeros(); /*
* toPlainString();不使用科学计数法输出
*/
String answerString = answerBigDecimal.toPlainString();
if (answerString.startsWith("0.")) {
answerString = answerString.substring(1);
} System.out.println(answerString);
} } }
[POJ 1001] Exponentiation C++解题报告 JAVA解题报告的更多相关文章
- POJ 1001 Exponentiation(大数运算)
POJ 1001 Exponentiation 时限:500 ms 内存限制:10000 K 提交材料共计: 179923 接受: 43369 描述:求得数R( 0.0 < R < ...
- [POJ 1000] A+B Problem 经典水题 C++解题报告 JAVA解题报告
A+B Problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 311263 Accepted: 1713 ...
- POJ 1001 Exponentiation(JAVA,BigDecimal->String)
题目 计算实数a的n次方,具体输出格式看案例 import java.util.*; import java.math.*; public class Main { public static voi ...
- poj 1001 Exponentiation 第一题 高精度 乘方 难度:1(非java)
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 138526 Accepted: 33859 ...
- POJ 1001 Exponentiation 无限大数的指数乘法 题解
POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. ...
- [POJ] #1001# Exponentiation : 大数乘法
一. 题目 Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 156373 Accepted: ...
- POJ 1001 Exponentiation
题意:求c的n次幂……要求保留所有小数…… 解法:一开始只知道有BigInteger……java大数+模拟.第一次写java大数……各种报错各种exception……ORZ 没有前导0和小数后面的补位 ...
- POJ 1001 Exponentiation 模拟小数幂
模拟小数幂 小数点位 pos 非零末位 e 长度 len 只有三种情况 pos > len pos < e e < pos < len #include <iostrea ...
- 【LeetCode】383. Ransom Note 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 [LeetCo ...
随机推荐
- linux系统基本结构-《循序渐进linux》
1.linux控制台 linux系统由桌面控制台(X -Window视窗)和字符控制台组成.字符控制台是linux的核心,默认linux下有6个字符控制台. 字符控制台--〉X-Window下:ctr ...
- LNK2005错误——重复定义错误
编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误.弄清楚它形成的原因,就可以轻松解决它了. 造成LNK2005错误主要有以下几种情况: 1.重复定义全 ...
- 51nod 1693 水群
基准时间限制:0.4 秒 空间限制:524288 KB 分值: 160 难度:6级算法题 收藏 关注 总所周知,水群是一件很浪费时间的事,但是其实在水群这件事中,也可以找到一些有意思的东西. 比如 ...
- 洛谷 P1588 丢失的牛
题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走到2*x的位置.计算他 ...
- [Git]常用的Git命令行
Commit的用法 git init [+项目名] git add . (注意这里在add后面的空格和点是不能省略的) git status git commit -m “message”(这里的me ...
- Winform C# 编程 1
http://b6ec263c.wiz03.com/share/s/2SX2oY0nX4f32CY5ax1bapaL01Wmfc0B-QfB2pS1y13peTbq
- UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
题意:有n支队伍(n是2的整数幂,2<=n<=4),打淘汰赛,胜者进入下一轮,其中1号队伍能打败至少一半的队伍,对于它不能打败的队伍l,一定存在一支它能够打败的队伍w,使得w能直接打败l, ...
- springboot autoconfig
springboot自动配置的核心思想是:springboot通过spring.factories能把main方法所在类路径以外的bean自动加载 springboot starter验证 我在spr ...
- python之golbal/nonlocal
一.关键字 golbal nonlocal 在局部修改全局的变量为什么会报错 count = 0 def func(): count += 1 func() # UnboundLocalError: ...
- C++内存溢出和内存泄漏?
1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...