藍橋杯---歷屆試題 小數第n位
阿新 • • 發佈:2019-01-26
1.問題描述
我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。
如果我們把有限小數的末尾加上無限多個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
2.問題分析
簡單來看此題為解決大數的除法,主要應先找到小數點第k位。
3.程式碼分析
1.首先想到的是用迴圈來解決此問題,程式碼如下
#include<iostream> #include<cstdio> #include<string> #include<cmath> #include<cstdlib> using namespace std; void deal(long long a, long long b , long long n) { long long d,e,i=0,t=0; while(n) { d=a/b; e=a%b; if(t==1) {i++;e*=10;} if(i>=n) { cout<<d; if(i==n+2) { cout<<endl; break; } } if(d==0) { t=1; e*=10; } a=e; } } int main() { long long a,b,n; cin>>a>>b>>n; deal(a,b,n); return 0; }
但這樣由於資料較大會出現超時錯誤
2.因此對程式碼進行優化處理 用小數點來快速對k定位
(ac程式碼如下:)
#include <iostream> using namespace std; int main() { long long i,a,b,t,n; cin>>a>>b>>n; a=a%b; while(n-10>0) //每次取10位,快速逼近小數點 確定K的位置 { a*=1e10; //1e10=10000000000 a%=b; n-=10; } for(i=0;i<n+2;i++) { a*=10; if(i>=n-1) cout<<a/b; a%=b; } return 0; }