1. 程式人生 > >備戰藍橋杯決賽----堅持第七天!!!

備戰藍橋杯決賽----堅持第七天!!!

       今天的目標是刷真題,看看國賽題目的難度。四道題目,其中三道根本看不懂,就算是看其他人寫的程式碼,也不是很明白,而且這四道題目是B組題,想想我那國賽A組題,那難度比這還要高一個檔次啊!!!內心是崩潰的,也許我這兩週小突破,不足以讓我提升很多,還剩最後七天,我更應該在基礎的知識點還有心態上下功夫,如果像現在這個樣子,肯定直接gg。。

       說一下今天唯一解出來的題目。

問題描述  我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。
  如果我們把有限小數的末尾加上無限多個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

我知道這題目很簡單,但也是在我看了別人程式碼之後才懂得,對於小數點後的每一位,我並沒有第一時間想到非常巧妙的迴圈求解的方法,

而且在這題目中,對他的for迴圈剛開始沒有理解,浪費了一點時間,最後才發現是輸出三位,所以大家一定要看清題目。

程式碼:

#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) //目的是快速逼近小數點後第n位的位置,避免超時
    {  
        a*=1e10;  
        a%=b;  
        n-=10;  
    }  
    for(i=0;i<n+2;i++)  //注意這裡的for迴圈範圍與下面的if判斷結合,正好輸出的是三位
    {  
        a*=10;   //巧妙的算出每一位,僅利用a*=10與a%=b即可
        if(i>=n-1) cout<<a/b;  
        a%=b;  
    }  
    return 0;  
} 
剩下的沒有看懂的題目,我也會再研究,慢慢補上,今天的腦力實在是不夠了。。。