百炼1001: Exponentiation 解题
链接:http://bailian.openjudge.cn/practice/1001/
思路
乍一看是很简单的题目,但是答案必须高精度输出,因此需要手动实现一个高精度运算方法。如果直接使用int,然后循环乘,结果很容易就会超出int的最大值。因此正确的思路是通过一个数组来保存答案,然后按照数组内容输出。我使用了一个vector容器来保存结果,将每次乘法的结果从个位数往上保存(即逆序)。
这一题需要注意的坑是:
- 需要去掉首尾多余的0;
- 不能去除太多的0。
解
这里我直接放我的代码,可以参考一下:
#include <iostream>
#include <vector>
using namespace std;
vector<short> multiply(vector<short> const &R_0, vector<short> const &R){
vector<short> ans;
int cf = 0;
for(int i = 0; i < R.size(); i++){
for(int j = 0; j < R_0.size(); j++){
int mul = cf + R[i] * R_0[j];
cf = mul / 10;
mul %= 10;
if(ans.size() <= i + j){
ans.push_back(mul);
}
else{
cf += (ans[i + j] + mul) / 10;
ans[i + j] = (ans[i + j] + mul) % 10;
}
}
if(cf) {
ans.push_back(cf);
cf = 0;
}
}
return ans;
};
int main() {
int const len = 6;
string s;
int n;
while(cin >> s >> n){
int dec = 0;
vector<short> R;
vector<short> R_0;
R_0.push_back(1);
for(int i = len - 1; i >= 0; i--){
if(s[i] == '.'){
dec = len - 1 - i;
}
else{
R.push_back(short(s[i] - '0'));
}
}
dec *= n;
for(int i = 0; i < n; i++){
R_0 = multiply(R_0, R);
}
int tail = 0;
while(R_0[tail] == 0)
tail ++;
int i = R_0.size()-1;
while(R_0[i] == 0 && i > dec-1) i--;
for(; i >= tail || i > dec-1; i--){
if(i == dec-1)
cout << ".";
cout << R_0[i];
}
cout << endl;
}
return 0;
}
推荐用例
除了页面上的几个用例可以测试外,可以用以下用例判断程序是否错误:
130.00 12
期望结果:
23298085122481000000000000
百炼1001: Exponentiation 解题的更多相关文章
- POJ 1001 Exponentiation(大数运算)
POJ 1001 Exponentiation 时限:500 ms 内存限制:10000 K 提交材料共计: 179923 接受: 43369 描述:求得数R( 0.0 < R < ...
- [POJ 1001] Exponentiation C++解题报告 JAVA解题报告
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 126980 Accepted: 30 ...
- 百炼OJ - 1001 - Exponentiation
题目链接 哇一遍AC的感觉也太爽了吧:) #include <stdio.h> #include <string.h> int times=0; char *myCalc(ch ...
- [POJ] #1001# Exponentiation : 大数乘法
一. 题目 Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 156373 Accepted: ...
- POJ 1001 Exponentiation 无限大数的指数乘法 题解
POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. ...
- 1001. Exponentiation高精度运算总结
解题思路 这道题属于高精度乘法运算,要求输入一个实数R一个指数N,求实数R的N次方,由于R有5个数位,而N又特别大,因此用C++自带的数据类型放不下. 解题思路是通过数组储存每次乘积结果和底数的每一位 ...
- poj 1001 Exponentiation 第一题 高精度 乘方 难度:1(非java)
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 138526 Accepted: 33859 ...
- POJ 1001 Exponentiation(JAVA,BigDecimal->String)
题目 计算实数a的n次方,具体输出格式看案例 import java.util.*; import java.math.*; public class Main { public static voi ...
- POJ 1001 Exponentiation
题意:求c的n次幂……要求保留所有小数…… 解法:一开始只知道有BigInteger……java大数+模拟.第一次写java大数……各种报错各种exception……ORZ 没有前导0和小数后面的补位 ...
随机推荐
- 网工最实用最常用的网络命令之一——Ping 命令详解(一)
Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障. ...
- MySQL大数据表水平分区优化的详细步骤
将运行中的大表修改为分区表 本文章代码仅限于以数据时间按月水平分区,其他需求可自行修改代码实现 1. 创建一张分区表 这张表的表字段和原表的字段一摸一样,附带分区 1 2 3 4 5 6 7 8 9 ...
- Win7命令终端基础配色指南
微软对控制台字体的元数据有严格的限制,https://support.microsoft.com/zh-cn/help/247815/necessary-criteria-for-fonts-to-b ...
- mybatis 中的<![CDATA[ ]]>
在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]&g ...
- 了解注解及java提供的几个基本注解
先通过@SuppreessWarnings的应用让大家直观地了解注解: 通过System.runFinalizersOnExit(true);的编译器警告引出 @SuppressW ...
- 1.2环境的准备(二)之Pycharm的安装和使用
目录: 1.Pycharm的安装 2.Pycharm的使用 (一)pycharm的安装: (1)官网下载:(分为两个版本,专业版和社区版,社区版就足够我们学习用的)https://www.jetbra ...
- Camstar MES 5.8 發現Ajax事件失效
從Camstar4.5升級到5.8後,發現原來用戶在4.5下可以正常使用的不良信息收集功能,列出的不良只有第一頁可以顯示,無法自動裝載下一頁. 嘗試發出,IE以下這個選項沒有選中,選中後,就可以正常工 ...
- 百度地图Key的设置方法
一.为什么要设置百度Key 万能地图下载器提供了百度POI的下载功能,但由于本软件用户群极大,会导致一天之内访问量超出300万次以上而无法继续下载. 因此,当POI下载不成功能,用户可以自己申请百度地 ...
- BZOJ2079:[POI2010]Guilds(乱搞)
Description Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处.这里有n个城市,其中有一些以双向马路相连,这两个工 ...
- 容器内部设置JVM的Heap大小
容器内部利用脚本来获取容器的CGroup资源限制,并通过设置JVM的Heap大小. Docker1.7开始将容器cgroup信息挂载到容器中,所以应用可以从 /sys/fs/cgroup/memory ...