题目
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个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
题目注意
求整数除法小数点后的第n位开始的3位数 一定是从第n位开始,是包括第n位,而不是第n位之后
有三种情况
1 整除
2 无限不循环小数
3 无限循环小数
当出现更新后的被除数等于初始被除数的情况,就说明这是循环的 (听不懂没关系看下图)
{
比如 22/7 我们首先让22对7取余,变成1。然后题目就变成求1/7
这个地方一定要理解sa==a的时候表明出现循环
}
采用模拟法,模拟除法规则
代码
#include<bits\stdc++.h>
using namespace std;
void solve(long long a,long long b,long long n)
{
long long ta=a%b; //我们要求小数位,所以要先取余,保证接下来模拟除法得到的都是小数位
long long tn=n-1; //为什么是n-1来控制循环? 因为要第n位开始的3位数,包括第n位
int cnt=0; //cnt用来计算有多少位是循环的
while(tn--)
{
if(ta==0) break; //说明可以整除 直接break
ta=ta*10%b; //模拟除法自己理解 ta是每次除法完成之后新的被除数
cnt++;
if(ta==a) tn=(n-1)%cnt; //ta==a的时候 就说明这个结果是循环小数了
//那么我们直接让tn控制循环变量 取余
}
if(ta==0) cout<<"000";
else
{
for(int i=0;i<3;i++)
{
cout<<ta*10/b;
ta=ta*10%b;
}
}
}
int main()
{
long long a,b,n;
cin>>a>>b>>n;
solve(a,b,n);
return 0;
}
;