历届试题 小数第n位
问题描述
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

比如n=4时,我们计算的是小数第四位,那么很明显就是40除于7的值,所以我们只需要知道第四位小数对应的哪个被除数是谁就行,用变量sa表示被除数,则第一位小数就是sa/7,余数就是下一个小数对应的被除数,那么用余数更新sa,一次类推可以计算出所有的小数,注意上图第一个被除数30如果在下面再次出现则容易知道接下来会重复计算,意味着产生循环节,所以我们可以通过循环节长度更新n,降低时间复杂度。
#include<bits/stdc++.h> using namespace std; int main()
{
int a,b,n;
int sa;
cin >> a >> b >> n;
sa=a%b;//初始化sa,sa是求每次相除的余数
for(int i=;i<=n;i++){
sa=sa%b*;//在本轮循环相除后余数发生改变
//cout << sa <<" "<<sa%b <<" "<<a%b << endl;
if(sa%b==a%b){//如果下一次循环(注意sa%b是下一次循环的余数)的余数 等于初始的余数,说明接下来的循环或重复之前的计算
n%=i;//n缩小(这是降低时间复杂度的关键) ,
i=;//重新开始遍历
}
}
for(int i=;i<=;i++){
cout << sa/b;//输出该位置计算结果 ,注意如果是有限小数切sa=0时,接下来都是输出0
sa=sa%b*;//下一次计算的余数
}
return ;
}
但是仔细一想上个代码其实是不完全正确的,或不完美的,虽然可以通过测试系统,因为上个代码默认循环节的第一个数字就是小数点后的第一个数字,但是很许多循环小数并非如此

这是第三个测试用例相除的结果,发现循环节是149,从第四个数字开始,如果我们要查询结果数亿之后的某个数的后三位,上个代码明显超时,所以需考虑循环节不在第一位的情况,
在上个代码上修改如下
#include<bits/stdc++.h>
using namespace std;
int t=;
int array[];
int compare(int m)//得到循环节开始的下标
{
for(int i=;i<t;i++){
if(array[i]==m) return i;//此时第二个循环节的第一个数字遇到第一个循环节的第一个数字,返回第一个循环节开始的下标 }
return ;
}
int main()
{
int a,b,n;
int sa;
cin >> a >> b >> n;
int m=;//表示还没遇到循环节
int num=; memset(array,,sizeof(array));
sa=a%b;//初始化sa,sa是求每次相除的余数
for(int i=;i<=n;i++){
if(m== && i!=) array[t++]=sa%b;
if(m== && i==) array[t++]=sa;
sa=sa%b*;//在本轮循环相除后余数发生改变
if(m==)
{
int aa=sa%b;
num=compare(aa);
// cout << num << endl;
}
if(num!=&&m!=){
n%=(i-num+);
n+=(num-);
i=;
m=;
}
//if(nu)
}
for(int i=;i<=;i++){
cout << sa/b;//输出该位置计算结果 ,注意如果是有限小数切sa=0时,接下来都是输出0
sa=sa%b*;//下一次计算的余数
}
return ;
}
下面的小demo是计算循环节的,根据上个代码衍生出来的
#include<bits/stdc++.h>
using namespace std;
int t=;
int array[];
int compare(int m)//得到循环节开始的下标
{
for(int i=;i<t;i++){
if(array[i]==m) return i;//此时第二个循环节的第一个数字遇到第一个循环节的第一个数字,返回第一个循环节开始的下标 }
return ;
}
int main()
{
//freopen("D:/Data.txt","r",stdin);
int a,b;
int sa;
cin >> a >> b;
int num=;
memset(array,,sizeof(array));
sa=a%b;
for(int i=;i<;i++){
if(sa%b==) {t=; break;}
if(i!=) array[t++]=sa%b;
if(i==) array[t++]=sa;
sa=sa%b*;
int aa=sa%b;
num=compare(aa);
if(num!=) break; }
if(t==) cout << "不存在循环节" << endl;
else{
sa=a%b;
for(int i=;i<=t;i++){
if(i>num) cout << sa/b;//输出该位置计算结果 ,注意如果是有限小数切sa=0时,接下来都是输出0
sa=sa%b*;//下一次计算的余数
}
}
return ;
}
历届试题 小数第n位的更多相关文章
- Java实现 蓝桥杯 历届试题 小数第n位
历届试题 小数第n位 时间限制:1.0s 内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的 ...
- 历届试题 小数第n位-(同余公式+快速幂)
问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...
- 历届试题 小数第n位(小技巧)
问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...
- 历届试题 小数第n位 (求循环节)
只要被除数出现重复,就表明循环节出现了.即使商不是循环小数,也可以补0作为循环节,这样就可以统一处理了. AC代码 #include <stdio.h> #include <vect ...
- 算法笔记_186:历届试题 高僧斗法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有“高僧斗法”的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地 ...
- 蓝桥杯 历届试题 剪格子(dfs搜索)
历届试题 剪格子 时间限制:1.0s 内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...
- 蓝桥杯 历届试题 PREV-34 矩阵翻硬币
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...
- Java实现蓝桥杯历届试题回文数字
历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...
- Java实现蓝桥杯历届试题高僧斗法
历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以 ...
随机推荐
- dd命令的解释
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. if=文件名:输入 ...
- Python3之itertools模块
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 1.Infinite Iterators Iterator Arguments Results Example cou ...
- django表单的字段验证(clean_<fieldname>())和ajax的字段验证
django中的Form有个很重要的功能:验证用户输入 而验证用户输入也可以分为2种: (1)前端本身的验证,例如:字段是否可为空,手机号码格式是否正确等: (2)前端输入数据和后台数据库数据的验证, ...
- S3C6410的启动代码分析 一
本文开始第一篇,启动代码的编写,注意,仅仅是启动代码,并不是bootloader,因为只有boot,没有loader. 第一要明确:CPU上电之后,会从某个固定地址执行指令.ARM结构的CPU从地址0 ...
- android 记录所有打开的Activity,退出程序
android 记录所有打开的Activity,退出程序 package com.main.server; import java.util.LinkedList; import java.uti ...
- errant-transactions
https://www.percona.com/blog/2015/12/02/gtid-failover-with-mysqlslavetrx-fix-errant-transactions/ 使用 ...
- 相关度算法BM25
BM25算法,通常用来作搜索相关性平分.一句话概况其主要思想:对Query进行语素解析,生成语素qi:然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加 ...
- 用C/C++扩展你的PHP
PHP取得成功的一个主要原因之一是她拥有大量的可用扩展.web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到.PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩 ...
- 虚拟机安装CentOS以及SecureCRT设置【完美无错版】
一.CentOS简介 CentOS是Linux的发行版之一,它安全.稳定.高效,是我最喜欢的Linux发行版之一.CentOS根据Red Hat Enterprise Linux开放源代码编译而成,与 ...
- c++ (proxy)代理模式
假设我们有几个具有相似的窗体,都包含关闭窗体(closeButton)和按钮单击事件(ClickButton)我们在处理时,不想直接操作每个窗体,可以请求代理. #include<iostrea ...