上文鏈接:藍(lán)橋杯之分考場-深度優(yōu)先遍歷(DFS)+簡單邏輯判斷簡化版(c++實現(xiàn))_C/C++_weixin_44077556的博客-CSDN博客
資源限制
時間限制:1.0s? 內(nèi)存限制:256.0MB
問題描述
我們知道黍瞧,整數(shù)做除法時怀跛,有時得到有限小數(shù)张弛,有時得到無限循環(huán)小數(shù)。
? ? ? ? 如果我們把有限小數(shù)的末尾加上無限多個0模庐,它們就有了統(tǒng)一的形式。
本題的任務(wù)是:在上面的約定下早处,求整數(shù)除法小數(shù)點后的第n位開始的3位數(shù)绩卤。
輸入格式
一行三個整數(shù):a b n,用空格分開土涝。a是被除數(shù)佛寿,b是除數(shù),n是所求的小數(shù)后位置(0<a,b,n<1000000000)
輸出格式
一行3位數(shù)字但壮,表示:a除以b冀泻,小數(shù)后第n位開始的3位數(shù)字。
樣例輸入
1 8 1
樣例輸出
125
樣例輸入
1 8 3
樣例輸出
500
樣例輸入
282866 999000 6
樣例輸出
914
數(shù)組存儲版
我的思路
整體思路:利用數(shù)組的每個索引存儲商的結(jié)果蜡饵,存儲的方式:某被除數(shù)a除于除數(shù)b會產(chǎn)生商和余數(shù)弹渔,而我們只保留商,利用余數(shù)進(jìn)行再次計算溯祸。
比如10/8,第一次商為1肢专,余數(shù)為2。
2/8,第二次商為0(商為0代表不夠借焦辅,則此時可知是小數(shù)點后的位置博杖,將2向小數(shù)后借10變?yōu)?0,則商為2),余數(shù)為4
40/8,第三次商為5筷登,余數(shù)為0剃根,
0/8,第三次商為0,余數(shù)為0
仆抵。跟继。。
由上述過程知在小數(shù)點前镣丑,保留商存儲到數(shù)組中舔糖,將余數(shù)和除數(shù)進(jìn)行再次計算;在小數(shù)點后莺匠,保留商存儲到數(shù)組中金吗,將余數(shù)乘以10和除數(shù)進(jìn)行再次計算。另外我們可知第一次出現(xiàn)被除數(shù)a除以除數(shù)b=0,則知此位置為小數(shù)點后第一位趣竣,需要將余數(shù)*10再計算
算法展示
#include <iostream>
using namespace std;
int main()
{
int a,b,n;//被除數(shù)a,除數(shù)b,小數(shù)點后n位置
int quotient[100000];//結(jié)果存儲數(shù)組
cin>>a>>b>>n;
//查找小數(shù)點位置
int count=0,temp=a;
while(1)
{
if(temp/b==0)break;//已經(jīng)進(jìn)行到個位計算時結(jié)束循環(huán)
temp%=b;
count++;//記錄小數(shù)點位置
}
//構(gòu)造商集
int i=0,mod=a;
while(i<(n+3+count))//只進(jìn)行到要查找的最終位置時停止計算(簡化運算步驟)
{
if(i<count)//小數(shù)點前存儲商
{
quotient[i++]=mod/b;
mod%=b;
}
else//小數(shù)點后存儲商
{
quotient[i++]=mod/b;
mod=mod%b*10;
}
}
for(int j=i-3;j<i;j++)//打印輸出
{
cout<<quotient[j];
}
cout<<endl;
return 0;
}
上述思路能解決的結(jié)果是不夠大的摇庙,我在藍(lán)橋上測試時發(fā)現(xiàn)僅為60分,所以進(jìn)行了以下改變遥缕。
直接計算版
我的思路
經(jīng)觀察我們不需要存儲結(jié)果也能知道n位置及以后的3位:我們只需要定位到在小數(shù)點后n位置并計算出其后三位結(jié)果即可卫袒。由上面算法能夠確定位置,接下來只需要計算即可单匣。算法的運行結(jié)果展示如下:**果然滿分**夕凝。
算法展示
#include <iostream>
using namespace std;
int main()
{
int a,b,n;
int quotient[100000];
cin>>a>>b>>n;
//查找小數(shù)點位置
int count=0,temp=a;
while(1)
{
if(temp/b==0)break;
temp%=b;
count++;
}
//計算結(jié)果
int i=0,mod=a;
while(i<(n+3+count))
{
if(i<count)
{
i++;
mod%=b;
}
else
{
if(i>=(n+count))//定位小數(shù)點后n位宝穗,打印結(jié)果
{
cout<<mod/b;
}
i++;
mod=mod%b*10;
}
}
cout<<endl;
return 0;
}