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;
}
Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
原文地址:https://www.cnblogs.com/VictorierJwr/p/12864721.html