问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入格式
一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0
输出格式
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
样例输入
1 8 1
样例输出
125
样例输入
1 8 3
样例输出
500
样例输入
282866 999000 6
样例输出
914
暴力代码
80分,最后一个样例无法通过
#include <bits/stdc++.h>
#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 3000
#define MAX 0x06FFFFFF
#define V vector<int>
using namespace std;
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int a,b,n,d,m;
I("%d%d%d",&a,&b,&n);
a=(a%b)*10;
int cnt=0;
while(cnt-n!=2){
d=a/b; //当前循环位
a=(a%b)*10;
cnt++;
if(cnt-n>=0)
putchar(d+48);
}
return 0;
}
判断循环节代码
其实这个代码很有问题,只能通过蓝桥杯这种水数据。
循环节的判断是暴力实现的,并且只能实现判断“从头开始”的循环节
例如8/7=1.1428571428571428571428571428571
但是无法判断如1/2=0.50000000000
这样的循环节
- 补充一下,感谢@flyawayl大佬提供了正确的思路,请移步他的这篇博客:历届试题 小数第n位 (求循环节)
#include <bits/stdc++.h>
#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 3000
#define MAX 0x06FFFFFF
#define V vector<int>
using namespace std;
V lst;
bool isLoop(){
int sz=lst.size();
int M=3;
if(sz%M) return 0;
sz/=M;
for(int i=0;i<sz;i++){
for(int j=0;j<M-1;j++)
if(lst[i+j*sz]!=lst[i+sz*(j+1)]) return 0;
}
return 1;
}
void process(int n){
int loopSize=lst.size()/3;
int pos=n%loopSize-1;
int cnt=3;
while(cnt--){
putchar(48+lst[pos++]);
}
}
int main(){
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int a,b,n,d,m;
I("%d%d%d",&a,&b,&n);
a=(a%b)*10;
int cnt=0;
int tmp=0;
while(cnt-n!=2){
d=a/b; //当前循环位
tmp++;
lst.push_back(d);
if(isLoop()){
process(n);
return 0;
}
a=(a%b)*10;
cnt++;
if(cnt-n>=0)
putchar(d+48);
}
return 0;
}