2008年3月6日 星期四

Problem 913 Joana and the Odd Numbers,喬安娜與奇數

這是一個初學者練習解題的好機會,這個可愛的喬安娜愛玩奇數,所以排列了奇數如下:

1
3 5 7
9 11 13 15 17
19 21 23 25 27 29 31

全部都是奇數,每一列的數量也是奇數,題目要求將最後面的三個數字相加後印出。
如果你要自己練習,請先不要看下面的解題經過。

解題過程:
行數  數字數量(n)  最後的值
1 1 (1) x 2 - 1
2 3 (1+3) x 2 - 1
3 5 (1+3+5) x 2 - 1
4 7 (1+3+5+7) x 2 - 1
5 9 (1+3+5+7+9) x 2 - 1
...
(n+1)/2 n (1+3+...+n) x 2 - 1

所以最後的值,可以直接用公式 1+3+...+n = ((1+n)*(n+1)/2)/2
(上底為1,下底為n,高為(n+1)/2)
經過簡化:最後值的公式是(n+1)*(n+1)/2 -1
最後三個數字和為:((n+1)*(n+1)/2-3)*3
所以程式的重點如下:
    while (scanf("%d", &n)!=EOF)
{
a = (((long long)(n+1)/2)*((n+1)/2)*2-3)*3;
printf("%lld\n", a);
}


a 必須宣告為 long long
做這一題時,我的Dev C++無法列印出正確的 long long答案,找了很多說法,我採用了其中的一個說法,那就是,你的電腦印不出來,不代表ACM線上裁判系統也印不出來,所以,上傳後,居然就過了。呵呵。
913題目連結
回ACM題庫目錄
回首頁

1 則留言:

匿名 提到...

"最後三個數字和為:((n+1)*(n+1)/2-3)*3"

是否有寫錯呢?
是*2不是/2