百炼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和小数后面的补位 ...
随机推荐
- Jenkins 基于 Docker git JAVA CI/CD
准备两台机器 192.168.31.200 centos7 docker harbor git 192.168.31.201 centos7 docker jenkins maven git Ha ...
- 【Alpha 冲刺】 6/12
今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 建立数据库 未完成 表结构文档已设计好,服务器mysql刚配置完成,但是,SpringMVC框架还没有熟络,不清楚如何使用该框架去 ...
- win10怎么更改切换输入法按键 切换输入法与Win7一样(Ctrl + 空格)
找到电脑左下角的“开始"图标,用鼠标右键点击它,在弹出的菜单选项里再用鼠标左键点击“设置”来打开Windows设置. 进入“Windows设置”后再点击“设备” 打开“设备”界面后再点击左边 ...
- Sqoop学习之路 (一)
一.概述 sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,Oracle 导入数据到 H ...
- 随手练——DFS小练
1. 单词接龙 https://www.luogu.org/problemnew/show/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头 ...
- MetaMask/provider-engine-3-test
通过看其test的代码去好好看看它是怎么使用的 1. provider-engine/test/basic.js const test = require('tape') const Provider ...
- <数据结构与算法分析>读书笔记--实现泛型构件pre-Java5
面向对象的一个重要目标是对代码重用的支持.支持这个目标的一个重要的机制就是泛型机制:如果除去对象的基本类型外,实现的方法是相同的,那么我们就可以用泛型实现来描述这种基本的功能. 1.使用Object表 ...
- 有crontab中的脚本不执行,需要在脚本里面export各种环境变量
[oracle@sta ~]$ vi .bash_profile # .bash_profile # Get the aliases and functionsif [ -f ~/.bashrc ]; ...
- 使用sysbench 进行msyql oltp压力测试
安装参考: https://github.com/akopytov/sysbench#linux#参数说明 需要说明的选项: mysql-db=dbtest1a:测试使用的目标数据库,这个库名要事先创 ...
- 【转】SVN branches trunk 合并 讲解
转自:http://blog.csdn.net/e3002/article/details/21469437 使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到 ...