Problem 0221 : FizzBuzz

問題概要

日本語なので本文参照(http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0221&lang=jp

m人の人がnまでの数をFizz Buzzした記録が与えられる。
間違った人が脱落していくとして、最後に残っている人の番号を昇順に出力せよ。

解法

シミュレート。

ソースコード

int n,m;
char in[99];

int main()
{
  while(scanf("%d%d",&m,&n),m){
    int r=m,c=0; bool a[1000];
    rep(i,m)a[i]=1;

    for(int i=1;i<=n;i++){
      for(;!a[c];c=(c+1)%m);
      scanf("%s",in);
      if(r==1)continue;
      if(i%15==0){
	if(strcmp(in,"FizzBuzz"))a[c]=0,r--;
      }
      else if(i%5==0){
	if(strcmp(in,"Buzz"))a[c]=0,r--;
      }
      else if(i%3==0){
	if(strcmp(in,"Fizz"))a[c]=0,r--;
      }
      else{
	if(!isdigit(in[0])||atoi(in)!=i)a[c]=0,r--;
      }
      c=(c+1)%m;
    }
    bool f=1;
    rep(i,m)if(a[i]){
      if(!f)putchar(' '); else f=0;
      printf("%d",i+1);
    }
    puts("");
  }
  return 0;
}