【算法】藍橋杯 算法提高 簡單加法

在這裏插入圖片描述

這道題有兩種思路:
1.暴力循環;
2.逆推。

怎麼說呢:
在算法題中,小數據最好用的方法就是暴力破解方法,雖然有時間、內存的限制,但是因爲數據量小,所以還是夠用的。

所以對於這道題,寫一個for循環,從1循環到1000,用取餘判斷即可。
代碼如下:

public class Main {

    public static void main(String[] ars) {
    	long alltime = 1000;
		System.out.println("start time:\t" + System.currentTimeMillis());
        int sum = 0;
        int num = 0;
        for (int i = 1; i < alltime; i++) {
            if (i % 3 == 0 || i % 5 == 0) {
                sum += i;
            }
            num++;
        }
        System.out.println("loop time:\t" + num);
        System.out.println("result:\t" + sum);
        System.out.println("end time:\t" + System.currentTimeMillis());
    }

}

【換個思路】
假設一個數x能夠除盡3,那麼也就是說,一定存在一個整數m*3=x
因爲存在這個關係,所以對於暴力的思路就可以轉換爲逆推了。
代碼如下:

public class Main {

    public static void main(String[] ars) {
    	long alltime = 1000;
        System.out.println("start time:\t" + System.currentTimeMillis());
        int x = 1;
        int y = 0;
        int n = 0;
        while (x * 3 < alltime) {
            y += x * 3;
            x++;
            n++;
        }
        x = 0;
        while (x * 5 < alltime) {
            if (x * 5 % 3 == 0) {
                x++;
                n++;
                continue;
            }
            y += x * 5;
            x++;
            n++;
        }
        System.out.println("loop time:\t" + n);
        System.out.println("result:\t" + y);
        System.out.println("end time:\t" + System.currentTimeMillis());
    }

}

爲了更好的對比這兩種算法的性能,我們不斷的增加總數的數量級,看看差距:
1000以內:alltime=1000

start time:	1574493454522
loop time:	999
result:	233168
end time:	1574493454523
start time:	1574493454523
loop time:	533
result:	233168
end time:	1574493454523

可以看到循環次數暴力是逆推的一倍

10000以內:alltime=10000

start time:	1574493530032
loop time:	9999
result:	23331668
end time:	1574493530032
start time:	1574493530032
loop time:	5333
result:	23331668
end time:	1574493530032

玩把大的10億
10 0000 0000以內:alltime=10 0000 0000

start time:	1574493591597
loop time:	999999999
result:	631780268
end time:	1574493593545
start time:	1574493593545
loop time:	5 3333 3333
result:	631780268
end time:	1574493594090

暴力循環10億次
1574493593545-1574493591597 = 1948毫秒
逆推循環5億次
1574493594090-1574493593545 = 545毫秒

所以,對於這道題,如果是求10億內的,用暴力循環就無法滿足時間要求了。

用逆推滿足時間要求。(應該與jvm對循環有優化,否則我們的理論時間應該是1948毫秒的一半,不是現在的1/4)

友好提示:真正算法驗證時,不需要這麼多的輸出。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章