1. 程式人生 > >《資訊奧賽一本通》1082:求小數的某一位

《資訊奧賽一本通》1082:求小數的某一位

1082:求小數的某一位
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
分數a/b化為小數後,小數點後第n位的數字是多少?
【輸入】
三個正整數a,b,n,相鄰兩個數之間用單個空格隔開。0<a<b<100,1≤n≤10000。

【輸出】
一個數字。

【輸入樣例】
1 2 1
【輸出樣例】
5

//1082:求小數的某一位
//這題可以反過來想,比如1/8=0.125,
//1 8 1結果是1(1相當於1*10/8得到結果1.25的個位數),
//1 8 2結果是2(2相當於1*10*10/8得到結果12.5的個位數),
//1 8 3結果是5(5相當於1*10*10*10/8得到結果125的個位數)。
//for迴圈中,為什麼先a=a%b,再a=a*10,而不是隻寫一個a=a*10?
//假設a/b的結果是一個無限不迴圈或無限迴圈小數,比如91/3的結果是30.3333……。
//假設求91/3的小數位第10000位,第1位小數是91*10/3的個位數,第2位是91*10*10/3的個位數……
//第n位是91* 10的n次方/3的各位數,當n>=64時,數字就已經超出現有的是資料範圍
//但我們發現,91/3的小數位和1/3(1為91除以3的餘數)的小數位,
//以91/3為例,下一次計算時,通過a=a*10,a變為10,再通過a=a%b,a得1的值 
//每次迴圈執行a=a%b,a=a*10可以確保a的範圍不會超出int型範圍 
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	int n,a,b;
	double shan;
	cin>>a>>b>>n;
	for(int i=1;i<=n;i++)
	{
		a=a%b;
		a=a*10;
	}	
	shan=floor(a*1.0/b);
	cout<<(int)shan%10<<endl;
}