2011年4月30日 星期六

c079: Peter's Smokes

內容 :
    Peter有 n 支紙煙,他一支一支的抽並且把煙屁股留起來。當他有 k 支煙屁股(k>1)時他可以把它們捲成一支新的紙煙。
請問Peter共可以抽幾支紙煙?

輸入說明 :
    每筆測試資料一列。每列有2個整數 n,k。

輸出說明 :
    對每一列輸入,請輸出Peter共可以抽幾支紙煙。

範例輸入 :
4 3
10 3
100 5

範例輸出 :
5
14
124

程式碼 :
#include <stdio.h>

int main()
{
    int n,k,some,sum;
    
    while(scanf("%d%d",&n,&k)==2)
    {
        sum = n;
        while(n > k-1)
        {
            some = n % k;
            sum = sum + (n=n/k);
            n = n + some;
        }
        printf("%d\n",sum);
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=c079

c022: 10783 - Odd Sum

內容 :
給你一個範圍 a 到 b ,請你找出 a 與 b 之間所有奇數的和。
例如:範圍 [3, 9] 中所有奇數的和就是 3 + 5 + 7 + 9 = 24 。

輸入說明 :
輸入的第一列有一個整數 T (1≦T≦100),代表以下有多少組測試資料。 每組測試資料為兩列,包含兩個數 a 與 b (0≦a≦b≦100)。

輸出說明 :
每組測試資料輸出一列,內容為 a 及 b 間所有奇數的和。

範例輸入 :
2
1 5
3 5

範例輸出 :
Case 1: 9
Case 2: 8

程式碼 :
#include <stdio.h>

int main()
{
    int a,b,i,j,n;
    
    scanf(" %d",&n);
    
    for(i=0;i<n;i++)
    {
        scanf(" %d %d",&a,&b);
        if(a%2==0)
            a++;
        if(b%2==0)
            b--;
        printf("Case %d: %d\n",i+1,((a+b)>>1)*(((b-a)>>1)+1));
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=c022

c007: TeX Quotes

內容 :
    TeX 是一種由 Donald Knuth 所發展出的一套文書排版軟體。這套軟體可以將原始文件檔加上一些像字型等型態後,轉成一份很漂亮的文件。而一份漂亮的文件是需要用 `` 和 " 來把別人說的話給「引」出來,而不是用大部份鍵盤上有的 " 。雖然鍵盤裡通常不會有這種有方向的雙引號鍵,不過上面有左單引號 ` (有人叫 backquote ),和右單引號 ' (有人叫 apostrophe 或 quote )。你可以在你的鍵盤上找一下,不過要小心不要將 ` 與 \ ( backslash 鍵)搞混了。而在 TeX 裡,使用者可以輸入兩個左單引號 `` 來構成一個左雙引號 `` ,或者是兩個右單引號 '' 來構造一個右單引號 '' ,不過呢,通常大家打字時都很習慣用普通的雙引號 " 來引述別人的話。
    如果原始文件檔內容是:
"To be or not to be," quoth the bard, "that is the question."
則 TeX 作出來的文件並不會是我們所想要的:
``To be or not to be," quoth the bard, ``that is the question."
為了要得到上面的文件,我們需要把原始文件變成這個樣子:
``To be or not to be,'' quoth the bard, ``that is the question.''
    你現在必須要寫一個程式,將普通的雙引號("),轉成有方向性的雙引號,而其它文字則不變。而在把普通的雙引號換掉的時候,要特別注意,當要開始引述一句話時要用 `` ,而結束引述時要用 '' 。不用擔心會有多層巢狀引號的情形,也就是第一個引號一定是用 `` 來代替,再來用 '',然後用 `` ,接著用 '' ,依此類推。

輸入說明 :
    輸入是若干列的文字,其中有偶數個雙引號( " ),以 end-of-file 做結束。輸出的文字必須和輸入的一模一樣,除了:
* 每一組雙引號的第一個 " 必須用兩個 ` 字元(就是 `` )來代替
* 每一組雙引號的第二個 " 必須用兩個 ' 字元( 就是 '')來代替。

輸出說明 :
    同上

範例輸入 :
"To be or not to be," quoth the Bard, "that is the question". The programming contestant replied: "I must disagree. To `C' or not to `C', that is The Question!"

範例輸出 :
``To be or not to be,'' quoth the Bard, ``that is the question''. The programming contestant replied: ``I must disagree. To `C' or not to `C', that is The Question!''

程式碼 :
#include<stdio.h>

int main()
{
    int i,j,change=1;
    char s1[1000],s2[1000];
    
    while(gets(s1)!=NULL)
    {
        for(i=j=0;s1[i]!='\0';i++,j++)
        {
            if(s1[i]=='"')
            {
                if(change)
                {
                    s2[j++] = '`';
                    s2[j] = '`';
                    change = 0;
                }
                else
                {
                    s2[j++] = '\'';
                    s2[j] = '\'';
                    change = 1;
                }
            }
            else
                s2[j] = s1[i];
        }
        s2[j] = '\0';
        printf("%s\n",s2);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=c007

c004: Beat the Spread!

內容 :
    超級盃又來了,為了打發中場休息時間,大家就來下注最後的結果會如何。大家下注的目標為兩隊最後的分數和,或者兩隊最後分數差的絕對值。
給你這2個值,你能推出這2隊最後的得分是多少嗎?

輸入說明 :
    輸入的第一列有一個整數,代表以下有多少組測試資料。 每組測試資料一列,有2個大於等於 0 的整數 s, d,s 代表比賽結束時2隊分數的總和, d 代表比賽結束時2隊分數差的絕對值。

輸出說明 :
    對每組測試資料輸出一列,包含2個整數代表比賽結束時這2隊的分數,分數大的在前。如果沒有這樣的分數,請輸出「 impossible」。 請記得:美式足球的分數一定是大於等於 0 的整數。

範例輸入 :
4
40 20
20 40
5 1
100 1

範例輸出 :
30 10
impossible
3 2
impossible

程式碼:
#include<stdio.h>

int main()
{
    int n,i,s,d,a,b;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&s,&d);
        a = s+d;
        if(a%2==1)
        {
            printf("impossible\n");
            continue;
        }
        a = a>>1;
        b = s - a;
        if(b < 0)
        {
            printf("impossible\n");
            continue;
        }
        printf("%d %d\n",a,b);
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=c004

c002: f91

內容 :
    McCarthy是一個有名的資訊專家。他定義了一個遞迴的函數叫做 f91 。它輸入一個正整數N並且依據以下的規則傳回一個正整數:
. 如果 N <= 100, 那麼 f91(N) = f91( f91( N+11) )
. 如果 N >= 101, 那麼 f91(N) = N-10
請你寫一個程式來計算 f91

輸入說明 :
    每組測試資料一列。含有1個正整數 N( N <= 1000000)。輸入最多有250000組測試資料。 若 N=0 代表輸入結束。

輸出說明 :
    對每組測試資料輸出一列 f91(N),。輸出格式請參考Sample Output。

範例輸入 :
500
91
0

範例輸出 :
f91(500) = 490
f91(91) = 91

程式碼 :
#include<stdio.h>

int f91(int n)
{
    if(n>100)
        return n - 10;
    else
        return f91(f91(n+11));
}

int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        if(n==0)
            break;
        printf("f91(%d) = %d\n",n,f91(n));
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=c002

b226: E. 鋪地磚

內容 :
    山治從小就立志要成為一個偉大的廚師,在歷經了辛苦的廚藝訓練、以及到處旅行後。他終於回到了故鄉芭拉蒂,並且在那裡蓋了一間小屋,準備開一間新的餐廳好好大展身手。
    然而新蓋好的水泥小屋空空如也,山治決定先從鋪地磚開始,之後再粉刷牆壁、掛上一些畫以及掛上美麗的吊燈等等。於是,他來到了「偉大航路量販店」,打算採買一些漂亮的地磚回去鋪滿他的小屋。「偉大航路量販店」真是無奇不有,那裡面賣的地磚有大有小、各種樣式,甚至有的比山治的小屋還大。讓山治看得眼花撩亂、暈頭轉向。
    為了採買方便,山治決定挑選其中一種大小的地磚,然後算足數量帶回去鋪。但是山治的數學不太好,他雖然知道自己小屋的長和寬各是幾公尺,但他卻不知道該買多少塊磁磚、該挑多大的磁磚,才會正好拼滿他的小屋。
假如你正好在「偉大航路量販店」打工,你能夠幫山治判斷他挑選的地磚正好需要多少塊才能鋪滿他的小屋嗎?
    注意:為了室內美觀,買回去的地磚如果是長方形,只能以同一個方向鋪而不能轉九十度。另外也不允許地磚被切割、重疊或者交錯。

輸入說明 :
    輸入的每行有四個正整數:
L<空格>W <空格>x<空格>y <換行>
L 和 W 分別表示山治小屋的長和寬 (1<=L, W <= 1000)
x 和 y 分別表示山治挑選的磁磚的長和寬 (1<= x, y <= 1000)
如果輸入 0 0 0 0 則結束程式。

輸出說明 :
    請對於每筆輸入測資,輸出山治所挑的地磚能不能正好鋪滿他的小屋。可以的話請輸出他該買多少片這樣的地磚回去。不行的話請輸出-1。

範例輸入 :
12 15 10 5
8 8 2 4
0 0 0 0

範例輸出 :
-1
8

程式碼 :
#include <stdio.h>

int main()
{
    int l,w,x,y;
    while(scanf("%d%d%d%d",&l,&w,&x,&y)==4)
    {
        if(l==w && w==x && x==y && y==0)
            break;
        l=l*w;
        x=x*y;
        if(l%x==0)
            printf("%d\n",l/x);
        else
            printf("-1\n");
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=b226

b127: 會議中心(Room)

內容 :
    拼拼樂會議中心是一個N×N 的超大型可分割式會議中心。每一個1×1 的空間都可以用隔板隔開,因此該會議中心最多可以有n2 個獨立的1×1 會議室,如要較大的會議室,則需將隔板拿掉使得二或更多個相鄰的1×1 空間可以合併使用。圖一的會議中心最多可分隔成169 個1×1 小會議室,最少則全部合併成為一個13×13 的會議室每間1×1 會議室皆以其二維平面座標為編號。選定一個1×1 會議室並給予編號 (0),相鄰的上、下、左、右會議室編號則依序為 (0, 1), (0, -1), (-1, 0), (0, 1)。
    會議中心外租會議室時,必須按照下列規則,組成合乎需求的會議室。一開始先以編號為(0, 0) 的空間供租用,如果空間不足,則依序向右方、上方、左方、下方的空間合併成為較大的會議室。每次擴充時,新加入的空間必須為正方形且該邊長必須與相鄰的擴充前會議室邊長相同,如此才能確保合併後的會議室一定是四方形。以下圖為例,第一次擴充租用空間時,右邊編號為 (1, 0) 的會議室空間會被跟編號為 (0) 的會議室合併。第二次擴充時,在 (0, 0), (1, 0) 上方的四個(2×2 正方形)小會議室會被合併進來。第三次擴充時,在 (0,0) ~ (0, 3) 左邊的 9 個 (3×3 正方形)小會議室會被合併進來。第四次擴充時,在 (-3,0) ~ (1,0) 下方的 25 個 (5×5 正方形)小會議室會被合併進來。第五次擴充時,在 (0,-5) ~ (0,2) 右方的 64 個 (8×8 正方形)小會議室會被合併進來。後續的擴充則依此類推。


現在,若給定一個n 的值,請計算第n 次擴充時的正方形會議室的邊長。

輸入說明 :
輸入檔只有一個整數n, n≦45。

輸出說明 :
請輸出第n 次擴充時的正方形會議室的邊長。

範例輸入 :
2
5

範例輸出 :
2
8

程式碼 :
#include <stdio.h>
int main() 
{
    int n;
    int arr[46]={1,1,2,3};
    
    for(n=4;n<46;n++)
        arr[n] = arr[n-4] + arr[n-3] + arr[n-1];
    
    while(scanf("%d",&n)==1)
        printf("%d\n",arr[n]);

    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=b127

b077: C. 不公平的人,是誰?

內容 :
    自從周杰倫出了新專輯「牛仔很忙」後,大郭和小郭就時常幻想自己是牛仔,終於有一天,大郭找來了兩把水槍要和小郭決鬥。
    可是玩了幾場以後,小郭全身都溼透了,大郭卻是一身乾爽,隱忍許久的小郭終於發難了!
小郭:「我都噴不到你………」
大郭:「那大概是你技術差吧?」
小郭:「騙人~騙人~你一定有作弊吧?」
    雖然小郭什麼都比大郭差(諸如智力、運動神經等…),但是如果在事前大郭準備給小郭的水槍比較差的話,那代表大郭是從一開始就有心把這場遊戲策畫成不公平的壞人。
    剛好路過的你,被吵吵鬧鬧的兩人抓去當裁判。

輸入說明 :
    輸入檔中有許多組輸入(一組輸入代表某一次比賽時某隊伍的提交紀錄),每組輸入佔一個區塊,每一組輸入裡,會以一組整數M、N做為開始,當M=0且N=0 時代表輸入結束。其中M代表大郭的水槍射程,N代表小郭的水槍射程,注意為求精確,所有射程的長度單位均為奈米。
    因為大郭弄來的水槍是22世紀的產物,故水槍的射程非常非常遠,最長可以到達4611686018427387904奈米(射程必為一非負整數)。

輸出說明 :
    對每一組測試資料,你應該輸出一列,該列從小郭的角度出發(小郭雖然比較笨,但還是很奸詐的!),判斷這是不是一場公平的比賽(對於小郭來說,只要大郭的射程不比小郭大,就是一場公平的遊戲)。
    若是對小郭有利的遊戲,則輸出「Fair」,若不是,則輸出「Unfair」

範例輸入 :
500 800
500 500
1099511627776 4611686014132420609
4611686018427387904 1099511627776
0 0

範例輸出 :
Fair
Fair
Fair
Unfair

程式碼 :
#include <stdio.h>

int main()
{
    int i,len1,len2,win;
    char s1[20],s2[20];
    
    while(scanf("%s%s",s1,s2)==2)
    {
        if(s1[0]=='0' && s2[0]=='0')
            break;
        win = 1;
        for(i=0;s1[i]!='\0';i++);
        len1 = i;
        for(i=0;s2[i]!='\0';i++);
        len2 = i;
        if(len1 > len2)
        {
            printf("Unfair\n");
            continue;
        }
        else if(len1 < len2)
        {
            printf("Fair\n");
            continue;
        }
        for(i=0;i<len1;i++)
        {
            if(s1[i] > s2[i])
            {
                win =0;
                break;
            }
            else if(s1[i] < s2[i])
                break;
        }
        if(win)
            printf("Fair\n");
        else
            printf("Unfair\n");
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=b077

2011年4月29日 星期五

b035: D. 海加爾山之戰

內容 :
     這是 Warcraft Ⅲ 劇情模式最後一場戰鬥,人類、獸人和夜精靈團結起來保護世界之樹,抵擋燃燒軍團的入侵。各個種族的軍隊聚集在海加爾山的山腳下,靈可能的加強世界之樹的防禦工事,同時夜精靈的首領 Malfurion 在山頂準備釋放最古老的世界之樹 Nordrassil 的力量,一口氣消滅燃燒軍團。
    玩家的任務就是在山下盡可能的拖延時間,讓 Malfurion 成功釋放出Nordrassil 的怒火。這天,Archimonde 率領著燃燒軍團追著人類的首領Jaina來到了一座森林。這座森林是人類的基地,裡面蓋了 n 座城堡。Jaina 計畫在這裡拖慢 Archimonde 前進的速度,方法很簡單:讓 Jaina 的軍隊被 Archimonde 追著,一邊放棄城堡一邊撤退,到最後沒路走了就用 Jaina 的傳送術帶大家飛到獸人的基地。執行戰術的時候只有一點要注意:被 Archimonde 走過的地方會變成腐地,馬上會被後面的燃燒軍團佔領,不能再回去了。如前面所提到的,目標是拖時間,所以希望讓 Archimonde 佔領越多城堡越好。Jaina 看著手上的地圖,暗自計算著擋得了多久...
    山下的城堡都是正方形的,Archimonde 佔領一座城堡大約需要和城堡面積相同的時間,因此佔領一座邊長為 3 的城堡大約要 9 個小時。

輸入說明 :
    輸入檔包含多組測試資料,每組測試資料的第一行有一個數字 n,表示有n(1 ≦ n ≦ 5000)座城堡。下一行每行有 n 個數字每座城堡的邊長,介於 1 到 100之間。讀到 n = 0 的時候代表測試檔案的結尾,不需要對於這個數字作任何輸出。

輸出說明 :
    對每組測試資料,輸出一個數字表示 Archimonde 大約需要幾個小時才能佔領每座城堡。

範例輸入 :
5
1 2 3 4 5
0

範例輸出 :
55

程式碼 :
#include <stdio.h>

int main()
{
    int i,n,c,sum;
    int arr[101];
    
    for(i=1;i<101;i++)
        arr[i] = i * i; 
    
    while(scanf("%d",&n)==1 && n)
    {
        sum = 0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&c);
            sum = sum + arr[c];
        }
        printf("%d\n",sum);
    } 
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=b035

a065: 提款卡密碼

內容 :
    文文記性不太好,常常會忘東忘西。他也常忘記提款卡密碼,每次忘記密碼都得帶著身份證、存摺、印章親自到銀行去重設密碼,還得繳交 50 元的手續費,很是麻煩。後來他決定把密碼寫在提款卡上免得忘記,但是這樣一來,萬一提款卡掉了,存款就會被盜領。因此他決定以一個只有他看得懂的方式把密碼寫下來。
    他的密碼有 6 位數,所以他寫下了 7 個大寫字母,相鄰的每兩個字母間的「距離」就依序代表密碼中的一位數。所謂「距離」指的是從較「小」的字母要數幾個字母才能數到較「大」字母。字母的大小則是依其順序而定,越後面的字母越「大」。
    假設文文所寫的 7 個字母是 POKEMON,那麼密碼的第一位數就是字母 P 和 O 的「距離」,由於 P 就是 O 的下一個字母,因此,從 O 開始只要往下數一個字母就是 P 了,所以密碼的第一位數就是 1。密碼的第二位數則是字母 O 和 K 的「距離」,從 K 開始,往下數 4 個字母 (L, M, N, O) 就到了 O,所以第二位數是 4,以此類推。因此,POKEMON 所代表的密碼便是 146821。
    噓!你千萬別把這個密秘告訴別人哦,要不然文文的存款就不保了。

輸入說明 :
    輸入有若干筆測試資料,每筆一行,每行有 7 個相連的大寫英文字母。

輸出說明 :
    對於每筆測試資料,輸出它所代表的密碼。

範例輸入 :
POKEMON
TYPHOON

範例輸出 :
146821
598701

程式碼 :
#include <stdio.h>

int main()
{
    int i,ans;
    char str[10];
    
    while(scanf("%s",str)==1)
    {
        for(i=0;i<6;i++)
        {
            ans = str[i+1] - str[i];
            if(ans < 0)
                ans = ~ans + 1;
            printf("%d",ans);
        }
        printf("\n");
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a065

a059: 完全平方和

內容 :
  給你一個範圍 a 到 b ,請你找出 a 與 b 之間所有完全平方數的和。
  例如:範圍 [3, 25] 中所有完全平方數的和就是 4 + 9 + 16 + 25 = 54 。

輸入說明 :
  輸入的第一列有一個整數 T (1≦T≦100),代表以下有多少組測試資料。
  每組測試資料為兩列,包含兩個數 a 與 b (0≦a≦b≦1000)。

輸出說明 :
  每組測試資料輸出一列,內容為 a 及 b 間所有完全平方數的和。

範例輸入 :
2
1
5
5
35

範例輸出 :
Case 1: 5
Case 2: 50

程式碼 :
#include <stdio.h>

int main()
{
    int i,j,a,b,arr[31],n,sum;
    
    for(i=1;i<32;i++)
        arr[i-1] = i*i;
    
    scanf("%d",&n);
    n++;
    for(j=1;j<n;j++)
    {
        scanf("%d%d",&a,&b);
        sum = 0;
        b++;
        for(i=0;a>arr[i];i++);
        for(;arr[i]<b;i++)
            sum = sum + arr[i];
        printf("Case %d: %d\n",j,sum);
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a059

2011年4月28日 星期四

a058: MOD3

內容 :
    相信判斷一個數除以三的餘數是多少,對你來說應該沒有問題。那,如果一次請你判斷很多個數呢嘿嘿?給你n個數字,請你輸出3k、3k+1、3k+2的數各有幾個

輸入說明 :
    第一行有一個正整數n,代表接下來有幾個數字,接著有n個介於1到50000之間的數字,請你做判斷

輸出說明 :
    輸出三個數字(以空白隔開),分別為n個數字中,三的倍數、三的倍數+1、三的倍數+2的數量

範例輸入 :
5
1
2
3
4
5

範例輸出 :
1 2 2

程式碼 :
#include <stdio.h>
int main()
{
    int i,a,n,arr[3]={0};
    
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);
        arr[a%3]++;
    }
    printf("%d %d %d\n",arr[0],arr[1],arr[2]);
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a058

a053: Sagit's 計分程式

內容 :
        sagit 是一位高中電腦老師,這學期正在教學生寫C++程式。他的評分標準是依照每一位學生在 ZeroJudge 系統上解出的題數,去計算出對應的得分。為了不讓分數落差太大,因此他並不是採取每一題固定得分的方式,而是隨著題數增加而調整每題的得分。規則如下:
答對題數在 0~10 者,每題給6分。
題數在 11~20 者,從第11題開始,每題給2分。(前10題還是每題給6分)
題數在 21~40 者,從第21題開始,每題給1分。
題數在 40 以上者,一律100分。
       如此一來,只要寫10題,就可以得到60分,寫20題,就可以得到80分,不過要得到滿分100分,則是要寫到40題,所以同學們分數的差距就大大地減少了。
       不過問題來了,雖然學生們因為這樣的計分公式而大大地提升了及格率,但因為 sagit 有600多位學生,一個一個去計算真的是一件很吃重的工作,所以現在想請你幫他寫個程式解決這個問題。

輸入說明 :
每組測資只有一個整數 N (0<=N<=100),代表學生在 ZeroJudge 系統上解出的題數。

輸出說明 :
印出該位同學的得分。

範例輸入 :
10
40

範例輸出 :
60
100

程式碼 :
#include <stdio.h>

int main()
{
    int i,sum;
    while(scanf("%d",&i)==1)
    {
        sum = 0;
        sum = sum + (i>10?10:i)*6;
        if(i>10)
        {
            sum = sum + (i>20?10:(i-10))*2;
            if(i>20)
                sum = sum + (i>40?20:(i-20));
        }
        printf("%d\n",sum);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a053

a044: 空間切割

內容 :
對任意正整數n,空間中的n 個平面最多可將空間切成幾個區域?

輸入說明 :
none
輸出說明 :
none

範例輸入 :
1
2

範例輸出 :
2
4

程式碼 :
#include <stdio.h>

int main()
{
    int n;
    
    while(scanf("%d",&n)==1)
        printf("%d\n",(n*(n*n+5)/6)+1);

    return 0;
}

PS:
空間中任作n個平面,最多將空間分成多少個區域?
ans: (n+1)(n*n-n+6)/6

http://zerojudge.tw/ShowProblem?problemid=a044

a042: 平面圓形切割

內容 :
對任意正整數n,平面上的n 個圓最多可將平面切成幾個區域?



輸入說明 :
none
輸出說明 :
none
範例輸入 :
3
4

範例輸出 :
8
14

程式碼 :
#include <stdio.h>

int main()
{
    int n;
    
    while(scanf("%d",&n)==1)
        printf("%d\n",n*n-n+2);

    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a042

a040: 阿姆斯壯數

內容
所謂 Armstrong number 指的是一個 n 位數的整數,它的所有位數的 n 次方和恰好等於自己。

如:1634 = 14 + 6+ 34+ 44 

請依題目需求在一定範圍內找出該範圍內的所有 armstrong numbers.

輸入說明
輸入包含兩個數字n, m(n0, m<=1000000),代表所有尋找 armstrong number 的範圍

輸出說明
將所有範圍內的 armstrong number 依序由小到大輸出,如果沒有找到請輸出 none.

範例輸入
100 999
10 99

範例輸出
153 370 371 407
none

程式碼1 :(重頭算到尾的寫法)
#include <stdio.h>

int main()
{
    int a,b,i,j,k,len=4,sum,one_num_sum,temp,index;
    int arr[25];
    int num[8];
    
    for(i=1,index=0;i<1000000;i++)
    {
        temp = i;
        for(len=0;temp!=0;len++)
        {
            num[len] = temp % 10;
            temp = temp / 10;
        }
        sum = 0;
        for(j=0;j<len;j++)
        {
            for(k=0,one_num_sum=num[j];k<len-1;k++)
                one_num_sum = one_num_sum * num[j];
            sum = sum + one_num_sum;
        }
        if(i == sum)
        {
            arr[index++] = sum;
        }
    }
    while(scanf("%d%d",&a,&b)==2)
    {
        for(i=0; i<index && a>arr[i]; i++);
        b++;
        if(b > arr[i])
        {
            for(;i<index && b>arr[i];i++)
                printf("%d ",arr[i]);
            printf("\n");
        }
        else
            printf("none\n");
        
    }
    return 0;
}

程式碼2 :(已經算好結果的寫法)
#include <stdio.h>

int main()
{
    int a,b,i,index;
    int arr[20]={1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474,54748,92727,93084,548834};
        
    index = 20;
    while(scanf("%d%d",&a,&b)==2)
    {
        for(i=0; i<index && a>arr[i]; i++);
        b++;
        if(b > arr[i])
        {
            for(;i<index && b>arr[i];i++)
                printf("%d ",arr[i]);
            printf("\n");
        }
        else
            printf("none\n");
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a040

a038: 數字翻轉

內容 :
輸入任意數字,並將其數字全部倒轉

輸入說明 :
一個整數,不超過 2^31

輸出說明 :
翻轉過後的數字

範例輸入 :
12345

範例輸出 :
54321

程式碼 :
#include <stdio.h>
#include <string.h>
int main()
{
    int i,len;
    char s1[15],s2[15];
    
    while(gets(s1)!=NULL)
    {
        len = strlen(s1);
        for(i=0;i<len;i++)
            s2[i] = s1[len-i-1];
        s2[len] = '\0';
        for(i=0;s2[i]=='0';i++);
        printf("%s\n",s2+i);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a038

a034: 二進位制轉換

內容 :
還記得計算機概論嗎?還記得二進位嗎?
現在我們來計算一下將一個10進位的數字換成二進位數字

輸入說明 :
一個十進位的數值

輸出說明 :
輸出二進位制的結果

範例輸入 :
3
6

範例輸出 :
11
110

程式碼 :
#include <stdio.h>

int length;
char s[50];

void TentoBin(int index, int i)
{
    if(i/2==0)
    {
        length = index;
        s[0] = i + '0';
        s[index+1] = '\0';
        return ;
    }
    TentoBin(index+1,i/2);
    s[length - index] = (i%2) + '0';
}

int main()
{
    int i;
    
    while(scanf("%d",&i)==1)
    {
        TentoBin(0,i);
        printf("%s\n",s);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a034

a032: 階乘運算

內容 :
給定一個 n 值,請計算出 n! 的結果

輸入說明 :
輸入一個整數 n

輸出說明 :
輸出 n! 結果,結果不大於 2^63

範例輸入 :
0
1
5

範例輸出 :
1
1
120

程式碼 :
#include <stdio.h>

int main()
{
    int i,n,max=1,temp;
    long long arr[21]={1,1};
    
    while(scanf("%d",&n)==1)
    {
        if(n > max)
        {
            temp = n + 1;
            for(i=max+1;i<temp;i++)
                arr[i] = arr[i-1] * i;
        }
        printf("%lld\n",arr[n]);
    } 
    return 0;
}

http://zerojudge.tw/ShowProblem?problemid=a032

a024: 最大公因數(GCD)

內容 :
給定兩個數字,請得出它們的最大公因數

輸入說明 :
兩個整數 大於 0, 小於 2^31

輸出說明 :
最大公因數為一整數

範例輸入 :
12 15

範例輸出 :
3

程式碼 :
#include <stdio.h>

int main()
{
    int i,a,b;
    
    while(scanf("%d%d",&a,&b)==2)
    {
        if(b>a)
            a^=b^=a^=b;
        while((a=a%b)!=0)
            a^=b^=a^=b;
        printf("%d\n",b);
    } 
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a024

2011年4月27日 星期三

a022: 迴文

內容 :
迴文的定義為正向,反向讀到的字串均相同,如:abba , abcba ... 等就是迴文。
請判斷一個字串是否是一個迴文?

輸入說明 :
一個字串(長度 < 1000)

輸出說明 :
yes or no

範例輸入 :
abba
abcd

範例輸出 :
yes
no

程式碼 :
#include<stdio.h>
#include<string.h>

int main()
{
    int i,len,check;
    char s[1000];
    
    while(scanf("%s",s)==1)
    {
        len = strlen(s);
        check=1;
        for(i=0;i<len/2;i++)
            if(s[i]!=s[len-i-1])
            {
                check = 0;
                break;
            }
        if(check)
            printf("yes\n");
        else
            printf("no\n");
    }
    
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a022

a020: 身分證檢驗

內容 :
我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。

(1) 英文代號以下表轉換成數字
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 W=32 金門縣
F=15 台北縣 O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣
I=34 嘉義市 R=25 台南縣

(2) 英文轉成的數字, 個位數乘9再加上十位數的數字
(3) 各數字從右到左依次乘1、2、3、4....8
(4) 求出(2),(3) 及最後一碼的和
(5) (4)除10 若整除,則為 real,否則為 fake

例: T112663836
2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180
除以 10 整除,因此為 real

輸入說明 :
一組身分證號碼

輸出說明 :
輸出 real or fake

範例輸入 :
T112663836
S154287863

範例輸出 :
real
fake

程式碼 :
#include <stdio.h>

int main()
{
    int i,sum,arr[26]={1,10,19,28,37,46,55,64,39,73,82,2,11,20,48,29,38,47,56,65,74,83,21,3,12,30};
    char s[20];

    while(scanf("%s",s)==1)
    {
        sum = arr[s[0]-'A'];
        for(i=1;i<9;i++)
            sum = sum + (s[i]-'0')*(9-i);
        if((sum + (s[9]-'0')) % 10 == 0)
            printf("real\n");
        else
            printf("fake\n");
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a020

a015: 矩陣的翻轉

內容 :
已知一(m x n)矩陣A,我們常常需要用到另一個將A中之行與列調換的矩陣。這個動作叫做矩陣的翻轉。舉例來說,若

                    A = [ 3 1 2 ]
                           [ 8 5 4 ]


                   AT = [ 3 8 ]
                            [ 1 5 ]
                            [ 2 4 ]

現在 請您針對所讀取到的矩陣進行翻轉。

輸入說明 :
第一行會有兩個數字,分別為 列(row)<100 和 行(column)<100,緊接著就是這個矩陣的內容

輸出說明 :
直接輸出翻轉後的矩陣

範例輸入 :
2 3
3 1 2
8 5 4

範例輸出 :
3 8
1 5
2 4

程式碼 :
#include <stdio.h>

int main()
{
    int m,n,i,j;
    int arr[100][100];

    while(scanf(" %d %d",&m,&n)==2)
    {
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                scanf("%d",&arr[i][j]);

        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            printf("%d ",arr[j][i]);
            printf("\n");
        }
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a015

a012: Hashmat的戰役

內容 :
Hashmat是一個勇敢的將領,他帶著年輕的士兵從這個城市移動到另一個城市與敵人對抗。在打仗之前他會計算己方與敵方士兵的數目差距,來決定是要開打或不開打。Hashmat的士兵數絕不會比敵人的士兵數大。

輸入說明 :
每組測試資料1列,有2個整數,代表Hashmat及敵人的士兵數或反之。這些數不會超過263。

輸出說明 :
對每組測試資料請輸出Hashmat與敵人士兵數目的差(正數)。

範例輸入 :
10 12
14 10

範例輸出 :
2
4

程式碼 :
#include <stdio.h>

int main()
{
    long long a,b;
    while(scanf("%lld%lld",&a,&b)==2)
    {
    if(a>b)
        printf("%lld\n",a-b);
    else
        printf("%lld\n",b-a);
    }

    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a012

a011: 幼稚園的算數遊戲

內容 :
算一算每行有幾個字(word)。
Word的定義是連續的字元(letter: A~Z a~z)所組成的字。

輸入說明 :
一段文字(string)

輸出說明 :
字數(int)

範例輸入 :
Hello everybody!!
This is school principal speeking.

範例輸出 :
2
5

程式碼:
#include <stdio.h>
#include <string.h>

int main()
{
    int i,len,word;
    char s1[1000];
    
    while(gets(s1)!=NULL)
    {
        word = 0;
        len = strlen(s1);
        
        for(i=0;i<len;i++)
        {
            if(('A'<= s1[i] && s1[i] <= 'Z') || ('a'<= s1[i] && s1[i] <= 'z'))
            {
                word++;
                for(;i<len && ('A'<= s1[i] && s1[i] <= 'Z') || ('a'<= s1[i] && s1[i] <= 'z');i++);
            }
        }
        printf("%d\n",word);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a011

a010: 因數分解

內容 :
        各位在國小時都學過因數分解,都瞭解怎麼樣用紙筆計算出結果,現在由你來敎電腦做因數分解。
       因數分解就是把一個數字,切分為數個質數的乘積,如 12=2^2 * 3
其中, 次方的符號以 ^ 來表示。

輸入說明 :
一個整數, 大於1 且 小於等於 1000000

輸出說明 :
一個字串

範例輸入 :
20
17
999997

範例輸出 :
2^2 * 5
17
757 * 1321

程式碼:
#include <stdio.h>
#include <math.h>
int main()
{
    int i,j,n;
    int total_factor,check,sqr;
    int factor[78500];
    
    factor[0] = 2;
    factor[1] = 3;
    total_factor = 2;
    i=5;
    
    while(i<999984)
    {
        check = 1;
        sqr = sqrt(i);
        for(j=2;j<total_factor;j++)
        {
            if(i%factor[j] == 0)
            {
                check = 0;
                break;
            }
            else if(sqr < factor[j])
                break;
        }
        if(check)
        {
            factor[total_factor] = i;
            total_factor++;
        }
        i=i+2;
        
        check = 1;
        sqr = sqrt(i);
        for(j=2;j<total_factor;j++)
        {
            if(i%factor[j] == 0)
            {
                check = 0;
                break;
            }
            else if(sqr < factor[j])
                break;
        }
        if(check)
        {
            factor[total_factor] = i;
            total_factor++;
        }
        i=i+4;
    }
    while(scanf("%d",&n)==1)
    {
        check = 0;
        for(i=0;factor[i] <= n;i++)
        {
            for(j=0;(n%factor[i])==0;j++)
                n = n / factor[i];
            if(j>0)
            {
                if(check!=0)
                    printf(" * ");
                printf("%d",factor[i]);
                if(j>1)
                    printf("^%d",j);
                check=1;
            }
        }
        printf("\n");
    }   
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=a010

a009: 解碼器

內容 :
        在密碼學裡面有一種很簡單的加密方式,就是把明碼的每個字元加上某一個整數K而得到密碼的字元(明碼及密碼字元一定都在ASCII碼中可列印的範圍內)。例如若K=2,那麼apple經過加密後就變成crrng了。解密則是反過來做。這個問題是給你一個密碼字串,請你依照上述的解密方式輸出明碼。
        至於在本任務中K到底是多少,請自行參照Sample Input及Sample Output推出來吧!相當簡單的。

輸入說明 :
每筆測試資料一列。每列有1個字串,就是需要解密的明碼。

輸出說明 :
對每一測試資料,請輸出解密後的密碼。

範例輸入 :
1JKJ'pz'{ol'{yhklthyr'vm'{ol'Jvu{yvs'Kh{h'Jvywvyh{pvu5 1PIT'pz'h'{yhklthyr'vm'{ol'Pu{lyuh{pvuhs'I|zpulzz'Thjopul'Jvywvyh{pvu5

範例輸出 :
*CDC is the trademark of the Control Data Corporation.
*IBM is a trademark of the International Business Machine Corporation.

程式碼:
#include <stdio.h>

int main()
{
    int i;
    char s[100];
    
    while(gets(s)!=NULL)
    {
        for(i=0;s[i]!='\0';i++)
            s[i] = s[i] - 7;
        printf("%s\n",s);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a009

第一次學習python

學習python的好網站: 新手易上手

安裝步驟:
1.先下載python,並安裝。
  1. 如果想在eclipse下開發可以看這篇文章下一篇文章即可開始寫程式!
  2. 如果想要有直譯式的話,需要設定環境變數,在path下加入"C:\python27;C:\python27\Scripts;C:\python27\Lib;"這些東西就可以在cmd下直接用。
   PS : eclipse的pydev也可以用這個網址安裝 http://pydev.org/updates

自我學習:
 python 文件: http://docs.python.org/tutorial/
快速掌握基本的功能 : 按這裡
↑在直譯式的環境下學習效果更好

2011年4月19日 星期二

a google a day

網址 : agoogleaday
用途 : 提昇搜尋能力
語言 : 英文 + 繁體中文

    這是google用來提升我們搜尋能力的網站,每天都會出一個題目,讓我們去搜尋,提昇搜尋的能力,超cool的,只可惜是目前沒中文的!

有中文的出來了喲!!!(2011-05-18)
http://agoogleaday.com/tw

2011年4月2日 星期六

a007: 判斷質數

內容:
請判斷某數是否為質數 輸入說明 : 一個整數x, x= 2 且 x=2147483647

輸出說明:
質數 或 非質數

範例輸入:
13
14
範例輸出:
質數
非質數

程式碼:
#include<stdio.h>
#include<math.h>
int main()
{
    int a,i,check,temp;
    
    while(scanf(" %d",&a)==1)
    {
        check=1;

        if(a%2==0 && a!=2)
            check=0;
        else
        {
            temp = sqrt(a)+1;
            for(i=3;i<temp;i+=2)
            {
                if(a%i==0)
                {
                    check=0;
                    break;
                }
            }
        }
        if(check)
            printf("質數\n");
        else
            printf("非質數\n");
    }
    
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a007

a006: 一元二次方程式

內容 :
求一元二次方程式 ax2+bx+c=0 的根

輸入說明 :
輸入三個整數 a, b, c

輸出說明 :
Two different roots x1=?? , x2=??
Two same roots x=??
No real root
PS: 答案均為整數,若有兩個根則大者在前

範例輸入 :
1 3 -10
1 0 0
1 1 1

範例輸出 :
Two different roots x1=2 , x2=-5
Two same roots x=0
No real root

程式碼:
#include <stdio.h>
#include <math.h>
int main()
{
    int a,b,c,temp;
    
    while(scanf(" %d %d %d",&a,&b,&c)==3)
    {
        temp = b*b - 4*a*c;
        if(temp>0)
        {
            temp = sqrt(temp);
            a=a<<1;
            printf("Two different roots x1=%d , x2=%d\n",(-b+temp)/a,(-b-temp)/a);
        }
        else if(temp==0)
            printf("Two same roots x=%d\n",(-b)/(2*a));
        else
            printf("No real root\n");
    }   
    return 0;
}

http://zerojudge.tw/ShowProblem?problemid=a006