這是個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,不需要用冪函數,直接用比特來運算
所以節目很容易出來~
# include & ltstdio.h & gt
int main()
{
龍n;
scanf("%ld ",& ampn);
如果(n & gt0 & amp& ampn & lt= 30)
{
n =(1 & lt;& ltn)+2;
printf("%ld ",n);
}
返回0;
}
註意代表羊數的n值,因為至少要大於2 ^ 30+2,所以類型必須是long,long的取值範圍上限是2 ^ 31-1。
但這並不是最節省資源和時間的算法。讓我們轉換這個程序。首先,這裏我們申請壹個變量n,用於輸入輸出。這是壹種資源,我們將它移除。
主函數的兩個隱藏參數正好用上了,if判斷語句可以用三元運算符代替,在某些編譯器下效率更高,至少是壹樣的。
另外,關於include,其實不用寫也可以直接去掉。這裏我們只使用scanf和printf。大多數編譯器直接識別它們自己的標準輸入和輸出。為了優化代碼,即使沒有stdio,它們仍然可以被識別。
於是程序就變成這樣了~
int main(int argc,char** argv)
{
scanf("%d ",& ampargc);
((30-argc)& gt;= 0)?printf("%ld ",(long)(1 & lt;& ltargc)+2):0;
}
好吧,這可能不是最簡單的方法,但應該足夠了~
PS,更快的執行方式是黑。如果不考慮源代碼的長度,可以這樣做,因為A的取值範圍已經限定為1到30,然後手工計算出A是1到30的所有結果,然後初始化壹個29元素的答案數組,用switch判斷A的值,直接輸出答案。
PS2,更快的是不管他輸入什麽,妳都輸出妳猜的答案,然後不斷嘗試,人格爆炸,就像測試通過了壹樣,這個解只是他輸入的值的解,這個時候程序運行的速度出奇的快。這是最惡心的黑。POJ的許多問題只有壹個解決辦法。基本上大家都是先手工算出來,直接輸出答案。。。
PS3,如果樓主知道怎麽匯編,可以直接在。c文件,並直接輸出1內存左移的值和輸入值+2。雖然不知道為什麽這樣設計,但是有些匯編代碼是可以嵌入C文件的,可以編譯的。
PS4,常規的方式是做不了OJ的~
求問~