股價漲跌算法題

題目:股價一開始一塊錢,然后股價漲一天,跌一天,漲兩天,跌一天,漲三天,跌一天,以此類推,求第n天的股價。

根據(jù)題目繪制表格如下:

股價漲跌趨勢

根據(jù)題目和表格觀察規(guī)律,其中含有數(shù)列。假設沒有跌,每天都是比昨天漲一塊錢,那么股價肯定是等于n。實際上,股價是漲一天跌一天,漲二天跌一天,漲三天跌一天,漲四天跌一天,以此類推,可見跌的天序依次為3、6、10、15、21……,相鄰數(shù)字相差依次為3、4、5、6……。

再繼續(xù)觀察股價和天序的關系,從10開始,往前觀察。10以及前面總共有三次跌,那么4=10-2*3。9前面總共有兩次跌,那么5=9-2*2,3以及前面總共有一次跌,那么1=3-2*1,1以及前面沒有跌,那么1=1-2*0。其實所發(fā)現(xiàn)的這個方程式是合乎邏輯的,跌一次就少2,跌兩次就少2的2倍,跌三次就少2的3倍,以此類推,因此當天的股價就是把n減去跌的天數(shù)的2倍。因此股價方程式為:price=n-2*m,其中m為跌的天數(shù)。

怎么得出跌的天數(shù)m?這是本題的難點了。前面我們觀察到該題目有數(shù)列的規(guī)律,即股價跌于第3、6、10……天,這些數(shù)字有以下規(guī)律:

3=1+2
6=1+2+3
10=1+2+3+4

據(jù)此可推斷,股價還會跌于第15、21、28天,因為,

15=1+2+3+4+5
21=1+2+3+4+5+6
28=1+2+3+4+5+6+7

那么,如何根據(jù)這樣的規(guī)律計算得出跌的天數(shù)m?請看,

3=1+2      --- 1天
6=1+2+3    --- 2天
10=1+2+3+4 --- 3天

符合單調(diào)遞增數(shù)列的累加和公式:sum=n*(n+1)/2,而我們要求的是n-1,但是,n不會總是3、6、10……此類數(shù)字中的一個啊,對此,我們可以采取向下取整的辦法。比如,n等于4,最后經(jīng)過向下取整,最后得出m等于1,又比如,n等于9,最后經(jīng)過向下取整,最后得出m等于2。向下取整同樣適用于3、6、10……之類的數(shù)字,比如n等于10,經(jīng)過計算,m等于3,向下取整同樣等于3。那么,我們可以得出方程式為:n=(m+1)*(m+2)/2,我們要求解的是m,因此該方程式變?yōu)椋?code>m=floor(sqrt(2*n+0.25)-1.5),其中,sqrt表示取根,floor表示向下取整。

Okay,股價和第幾天的關系,我們清楚了,不妨用Java將算法描述出來。

public class Stock {
    public static void main(String[] args) {
        int day = Integer.parseInt(args[0]);// 第幾天
        System.out.println(calc(day));
    }

    public static int calc(int day) {
        int n = (int) Math.floor(Math.sqrt(day*2 + 0.25) - 1.5);// 跌了多少天
        int r = day - n * 2;// 股價
        return r;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容