历届试题 小数第n位--快速幂算法

2024-04-11 15:32

本文主要是介绍历届试题 小数第n位--快速幂算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
  如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
  本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

输入格式

  一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)

输出格式

  一行3位数字,表示:a除以b,小数后第n位开始的3位数字。

样例输入

1 8 1

样例输出

125

样例输入

1 8 3

样例输出

500

样例输入

282866 999000 6

样例输出

914

思路:

由于数据的范围很大,如果按照一般的算法进行计算,那么一定会超时;

也不能够用double s=a/b*10^(n+2),数据太大,double的精确度不够,所以我们要找到一个合适的算法进行求解;

最合适的算法就是快速幂算法--反复平方;

快速幂算法--反复平方:

A:

当 X^n=((X^2)^2)......;

如果把n表示为2的幂次的和:n=2^k1+2^k2+2^k3+.....;

那么X^n=(x^2^k1)(x^2^k2)(x^2^k3).......;

时间复杂度就是O(logn);

例如:

x^22=x^16*x^4*x^2;      (22转换成二进制是10110);

ll qq(ll n,ll k)
{ll ret=1;while(k){if(k&1)//如果二进制最低位为1,则乘上n^(2^i);ret=((ret%mod)*(n%mod))%mod;n=(n%mod)*(n%mod);//将n平方;k>>=1;//右移一位,相当于除2;}return ret%mod;
}

B:

也可以用另外一种思路来理解;

当n为偶数的时候有X^n=((x^2)^(n/2)),递归转为n/2的情况;

当n为奇数时有X^n=((x^2)^(n/2))*x;同样也递归转为n/2的情况。

这样递归下去,每次n都减半,于是可以在O(logn)时间内完成幂运算;

ll qq(ll n,ll k)
{if(k==0)return 1;ll ret=qq(n*n%mod,k/2);if(k&1)ret=ret*n%mod;return ret%mod;
}

代码如下:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;ll a,b,n,mod;ll qq(ll n,ll k)
{ll ret=1;while(k){if(k&1)//如果二进制最低位为1,则乘上n^(2^i);ret=((ret%mod)*(n%mod))%mod;n=(n%mod)*(n%mod);//将n平方;k>>=1;//右移一位,相当于除2;}return ret%mod;
}/*ll qq(ll n,ll k)
{if(k==0)return 1;ll ret=qq(n*n%mod,k/2);if(k&1)ret=ret*n%mod;return ret%mod;
}*/int main()
{while(~scanf("%lld%lld%lld",&a,&b,&n)){mod=b*1000;ll sum=(a%mod*qq(10,n+2))%mod;ll s=sum/b;printf("%lld\n",s);}return 0;
}

 

 

 

这篇关于历届试题 小数第n位--快速幂算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/894466

相关文章

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.