[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2004年予選>4問目

4問目(文字・文字列操作)

問題

英語の文字列の中に出現する単語の中で、文字数が最も多い単語を出力してください。入力データには英文字、スペースのみが含まれます(つっこみ。思うのだが改行も入るよね)。入力文字列の長さは80文字以下、一つの単語の文字数は32文字以下です。また、最長の文字数を持つ単語は文字列中にただ1つだけ存在する。

入力

英語の文章を表現する文字列(感覚の英文字、スペース)

出力

もっとも文字数が多い単語

入力例

I am a good doctor

出力例

doctor

解き方例

一つ目、単語ごとに分割してそれらの中からもっとも文字数が多いものを出力。java、.Netでおすすめ。

それぞれの単語の切れ目を変数で記録し、それぞれの単語の長さをバッファを使わずに調べる。cでおすすめ。ちょっと説明が難しいです。ソースコードを読んで理解していただけると嬉しいです。

ソースコード

お持ち帰り

C/C++

#include <stdio.h>

int main(){
    char in[82];
    int i;
    int s,m;//最長単語の始まりと終わりの位置
    int t;//単語の始まり位置
    int temp;//単語の長さ、一時用

    s = m = t = 0;

    //空白があるので、fgetsを使う。
    fgets(in,82,stdin);

    for(i=0;in[i] !='\0';i++){
        //下、単語ごとに分ける。
        if(in[i] == ' ' || in[i] == '\n'){
            temp = i-t;
            if(m < temp){
                s = t;
                m = temp;
            }
            t = i + 1;//単語の始まり位置
        }
    }

    //出力。下と同じ事をしている
    //for(i = s;i < s+m;i++)printf("%c",in[i]);
    in[s+m] = '\0';
    printf("%s\n",&in[s]);

    return 0;
}

その他

この問題は、ちょっとバッファの大きさを大きくしておいた方が吉だと思います。それぞれの関数は独自の動き方をします。特に「改行」「ヌル文字」を利用したプログラムですので、入力がしっかりしていないとちゃんとした結果になりません。今回は「文字列80+改行+ヌル文字 = 82」としました。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-7-23
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2004年予選>4問目