历届试题 小数第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

 题目注意

 

求整数除法小数点后的第n位开始的3位数  一定是从第n位开始,是包括第n位,而不是第n位之后

有三种情况

1 整除 

2 无限不循环小数

3 无限循环小数

当出现更新后的被除数等于初始被除数的情况,就说明这是循环的 (听不懂没关系看下图)

{

  比如 22/7 我们首先让22对7取余,变成1。然后题目就变成求1/7

历届试题 小数第n位  这个地方一定要理解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;
}

 

;