1

ACM プログラミング コンテストのアーカイブから検索したところ、ココナッツ プログラムの解決策が見つかりました。そのために従うべきテンプレートまたは手順はありますか。ありがとう

/*
1997 East-Central ACM regional programming contest
Held on November 8, 1997
Coconuts, Revisited -- Problem 3
Sample solution by Ed Karrels, Ed@tool.com
November 1997
*/
#include <stdio.h>
/* return 1 if this number of coconuts can be divided up
properly between this number of people */
int SplitCoco(long n_coco, long n_people) {
long i;
for (i=0; i<n_people; i++) {
/* check that the coconuts divide by the number of people
plus one remainder */
    if (n_coco % n_people != 1) return 0;
    /* remove 1 for the monkey, and one person's share */
        n_coco = n_coco - 1 - (n_coco / n_people);
    }
    /* check that the remaining coconuts divide evenly among
    the people */
    return (n_coco % n_people) == 0;
}


int main() {
    long n_coco;
    long n_people;
    long i, j, k;

    FILE *inf = stdin;
    while (fscanf(inf, "%ld", &n_coco), n_coco!=-1) {
    /* starting at the # of coconuts-1, count down until
    a number of people is found that works */
        for (n_people=n_coco-1; n_people > 1; n_people--) {
            if (SplitCoco(n_coco, n_people)) {
                 printf("%ld coconuts, %ld people and 1 monkey\n",
                 n_coco, n_people);
                 goto found;
                 /* OK, so yea, I put a 'goto' in my code :-)
                it was quick and it works. I don't do
                it often, I swear. */
            }
        }
     /* if no number of people greater than 1 works, there is
     no solution */
        printf("%ld coconuts, no solution\n", n_coco);
        found:
    }
    return 0;
}
4

3 に答える 3

8

あなたの場合、をカウントする別のルーチンを作成し、をwhileに置き換えることができます。goto foundreturn

一般に、各 goto をフラグといくつかの while ループに置き換えることができます。これでは、コードが読みやすくなりません。

于 2012-09-09T16:49:42.837 に答える
4

交換

goto found;

 break;

交換

 printf("%ld coconuts, no solution\n", n_coco);

と:

if(n_people <= 1)
    printf("%ld coconuts, no solution\n", n_coco);
于 2012-09-09T16:57:06.360 に答える
1

別の回答はすでにこれを示唆していますが、読みにくいことも示唆しています-私は同意しません-それが意味することのように読めることがわかりました。いずれにせよ、可能な解決策として説明する価値があります。

私のソリューションには、ブール型の定義が必要です。C99<stdbool.h>定義 (または C++ コンパイル)を想定しています。

これは、外側の while ループの本体です。

    bool found = false ;
    for (n_people=n_coco-1; n_people > 1 && !found; n_people--) 
    {
        found = SplitCoco(n_coco, n_people)
        if( found ) 
        {
            printf("%ld coconuts, %ld people and 1 monkey\n", n_coco, n_people);
        }
    }

    if( !found ) 
    {
        /* if no number of people greater than 1 works, there is no solution */
        printf("%ld coconuts, no solution\n", n_coco);
    }

場合によっては、追加のループごとのテストが法外になる可能性がありますが、ほとんどの場合、それは重要ではないことをお勧めします。

于 2012-09-09T17:25:16.357 に答える