[百炼]1001:Exponentiation 的问题

2024-03-10 10:32

本文主要是介绍[百炼]1001:Exponentiation 的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

问题描述:


给定一个包含小数点的在0.0到99.999的包含6位的输入数 r(以字符串的形式),和一个在0到25之间的数 n, 求 r 的 n 次方,要求是,输出结果不包括无效的0,这里的0既包括了在所得结果的最后几位的无效的0,也包括了0.345....中的0,即结果应当是.345....的形式,当所得结果是一个整数时,不应当打印小数点。


这是一个高精度计算的问题,思路是通过模拟乘法过程,求得结果。这里我们将 r 的每一位倒序存储到一个数组中,例如:3.0001(包含了6位),指数n 为 2,那么它的计算思路为 10003 *10003,那么 i 和 j 从0 开始,设结果为 result [i + j] = temp[j] *mul[i]

这一步实现了结果的每一位都是正确的。

这里的乘法并不是像下面的

  10009

*  10009

=         90081

+10009

=  100180081

而实际上90001*90001 = 8100180001,显然这两个结果倒序过来是不同的,实际的计算方法应当是:

10009

*10009

=10009

   +     90081

=  100081(这里的9+9的1进位应当相关数组元素下标大的方向进位)0081 (这里还是有些问题,等我回头再想一下), 实际上均满足

result [i + j] = temp[j] *mul[i]的表达式,i,j在这里最大都是4 , result[8] = temp[4]*mul[4]=18(8向后进位为result[9],这样就满足结果的正确性了)

 

程序ac:

具体的程序为:

#include<iostream>
#include<string>
using namespace std;
int main()
{string r;int n, pos_of_point;const int r_len = 160;int result[r_len], temp[r_len], mul[6];while (cin >> r >> n) {for (int i = 0;i < r_len;i++)temp[i] = result[i] = 0;for (int i = 0;i < 6;i++)mul[i] = 0;pos_of_point = 0;size_t pos = r.find(".");if (pos != string::npos)pos_of_point = (5 - pos) * n;for (int i = 5, j = 0;i >= 0;i--){if (r[i] != '.'){result[j] = temp[j] = mul[j] = r[i] - '0'; //按照逆序将字符转换为数字j++;}}while (n >= 2)//当指数为1时,只要按照规定的输出格式输出原数即可{--n;for (int i = 0;i < r_len;i++)result[i] = 0;for (int i = 0; i < 5;i++)//用乘数的每一位去乘过程temp值{int t;for (int j = 0;j < r_len;j++){if (mul[i] == 0)break;t = temp[j] * mul[i];result[i + j] += t;	//这两句话是核心//处理进位问题,并且是连续处理进位,如果使得下一位也产生进位,仍要进行计算for (int k = i + j;result[k] > 9; ++k){result[k + 1] += result[k] / 10;//注意一定是+=因为result[k + 1]在自己的循环时还要加上这个数	result[k] = result[k] % 10;}}}for (int i = 0;i < r_len;i++)//实际这里可以用一些方法精简计算temp[i] = result[i];//数据存储在temp数组中}//从后向前找到第一个不为0的数int firstIndex = -1;for (int i = r_len - 1;i >= pos_of_point;i--){if (result[i] > 0){firstIndex = i;break;}}int lastIndex = -1;for (int j = 0;j < pos_of_point;j++){if (result[j] != 0){lastIndex = j;break;}}if (firstIndex != -1){while (firstIndex >= pos_of_point){cout << result[firstIndex];--firstIndex;}}if (lastIndex != -1){cout << '.';--pos_of_point;while (lastIndex <= pos_of_point){cout << result[pos_of_point];--pos_of_point;}}cout << endl;}}

 

 

 

               

这篇关于[百炼]1001:Exponentiation 的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793957

相关文章

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Java程序运行时出现乱码问题的排查与解决方法

《Java程序运行时出现乱码问题的排查与解决方法》本文主要介绍了Java程序运行时出现乱码问题的排查与解决方法,包括检查Java源文件编码、检查编译时的编码设置、检查运行时的编码设置、检查命令提示符的... 目录一、检查 Java 源文件编码二、检查编译时的编码设置三、检查运行时的编码设置四、检查命令提示符

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR