42 小数第n位

Posted victorierjwr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了42 小数第n位相关的知识,希望对你有一定的参考价值。

42 小数第n位

作者: Turbo时间限制: 1S章节: 基本练习(循环)

问题描述 :

我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。

本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

输入说明 :

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

输出说明 :

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

比如输入:

1 8 3

则输出

500

输入范例 :
282866 999000 6
输出范例 :
914

#include <iostream>
using namespace std;

int main(){
	int a, b, n;
	int arr1[1000];
	int arr2[1000];
	int len = 0;
	cin >> a >> b >> n;
	a %= b;
	//保存前50位小数 
	for (int i = 1; i <= 50; i++){
		int t = (a * 10) / b;
		arr1[i] = t;
		a = (a * 10) % b;
	}
	int temp = a;
	//找到循环节 
	do{
		int t = (a * 10) / b;
		arr2[len++] = t;  //保存循环节
		a = (a * 10) % b;
	} while (temp != a);

	if (n <= 50){
		//如果k在前50位,直接输出从k处开始的三位 
		cout << arr1[n] << arr1[n + 1] << arr1[n + 2] << endl;
	}
	else{
		int t = (n - 50) % len;  //得到k在循环节中的起始位置 
		t--;    //数组从0开始,所以t要-1 
		cout<<arr2[t % len]<< arr2[(t + 1) % len]<<arr2[(t + 2) % len]<<endl;   //mod len是因为如果t + 2大于循环节了则从头开始 
	}
	return 0;
}




以上是关于42 小数第n位的主要内容,如果未能解决你的问题,请参考以下文章

小数第n位

历届试题 小数第n位 (求循环节)

小数第n位:高精度

蓝桥杯国赛 小数第n位(数论)

历届试题 小数第n位(小技巧)

历届试题 小数第n位-(同余公式+快速幂)