當前位置:編程學習大全網 - 源碼下載 - c語言 不容易的徐老漢 徐老漢這兩年辛辛苦苦養了不少羊,到了今年夏天,由於高溫幹旱,實在沒辦法解決牲

c語言 不容易的徐老漢 徐老漢這兩年辛辛苦苦養了不少羊,到了今年夏天,由於高溫幹旱,實在沒辦法解決牲

樓主妳好~

這是壹個OJ問題吧~~

首先,咱要說的是OJ問題基本上不是編程題,而是數學題或者短碼編程題~

這個問題其實是個數學題,可以發現當羊數量a從檢查站數量1-30遞增過程中,是有規律的,關系為:

a(n) = (a(n-1) - 1) * 2.

求其通項公式為:

a(n) = 2^(n-1) * a(1) - 2^(n-1) + 2.

其中a(1) = 3,則a(n) = 2^n + 2.

所以計算時不需要用循環,比如輸入2的時候,則羊的數量即為2^2 + 2 = 6。

而計算2^n不需要用pow函數,直接用位操作<<即可。

所以程序就很容易出來啦~

#include <stdio.h>

int main()

{

long n;

scanf("%ld", &n);

if(n > 0 && n <= 30)

{

n = (1 << n) + 2;

printf("%ld", n);

}

return 0;

}

要註意其中代表羊數量的那個值n,因為至少要大於2^30 + 2,所以類型必須為long,long的範圍上限是2^31 - 1。

但是這不是最省資源和時間的算法。我們來改造這個程序,首先這裏我們申請了壹個變量n,這個n用來輸入和輸出,這是壹個資源,我們把它去掉。

main函數隱藏的兩個參數正好拿來用,並且if判斷語句可以被三元運算符代替,且在某些編譯器下效率更高,至少是壹樣的。

另外關於include,其實直接去掉即可,不用寫,我們這裏只用到了scanf和printf,大多數編譯器直接認定自己的標準輸入輸出,為了優化代碼,所以即使不用stdio,仍然可以被識別。

所以程序變成了這樣~

int main(int argc, char** argv)

{

scanf("%d", &argc);

((30 - argc) >= 0)?printf("%ld", (long)(1 << argc) + 2):0;

}

OK,這可能不是最簡單的方法,不過應該足以應付了~

PS,執行更加迅速的方法是hack,如果不考慮源碼的長度,那麽可以這麽做,因為a的範圍已經限制在了1到30內,那麽用手算出a是1到30的所有結果,然後初始化壹個29個元素的答案數組,使用switch判斷a的值,直接輸出答案。

PS2,更加快的是不管他輸入什麽,妳都輸出妳推測的答案,然後不停的去試,人品爆發,剛好那次測試通過,這個解剛好是他輸入的值的解,這時候程序運行是出奇的快。這是最惡心的hack,像POJ裏面很多題目只有壹個解,基本上大家都是不管三七二十壹,先用手算出來,直接輸出答案的。。。

PS3,如果樓主懂匯編,可以直接在.c文件中寫匯編代碼,直接輸出1內存左移輸入值+2的值即可。雖然不知道為什麽這麽設計,但是C文件中可以內嵌壹定的匯編代碼,並且可以被編譯。

PS4,做OJ題就不能走常規路哦~

請追問~

  • 上一篇:哪些股票技術分析指標比較好用?
  • 下一篇:自平衡車的平衡原理
  • copyright 2024編程學習大全網