0

最近、codeforces サイトにこのソリューションがいくつかあります。if ステートメントの条件と、この質問の三項演算子の条件を理解できませんでした。誰かがこれを手伝ってくれますか?

#include<stdio.h>

int main(void)
{
    int a[1000]={0},ans,k;
    while((k=getchar())!='\n'){
      if(!a[k]){
          ans++;
          a[k]=1;
      }
    }
    puts(ans&1 ? "IGNORE HIM!":"CHAT WITH HER!");
    return 0;
}
4

2 に答える 2

3

これは奇妙なコードです。なぜそれが何をするのか完全にはわかりませんが、技術的な観点 (つまり、をするのか) から理解するのは簡単です。

ループは標準入力から一連の文字を取得し、一意のwhile文字ごとに変数に 1 を追加しansます。がゼロの場合、式!a[k]は true になります (すべてこの状態に初期化されます)。a[k]

その条件が true の場合、ansがインクリメントされ、a[k]に設定されます1。つまり、その値のそれ以上の文字は結果に影響しません (条件が再び true になることはありません)。

ifステートメントに関しては、式は奇数の場合 (下位ビットが設定されているans&1場合) に真になります。ans

そのため、名前に奇数の一意の文字が含まれている人を無視して、他の人と話すように指示しているようです. もちろん、実際には初期化しないため、すべてがバラバラになりますans。つまり、任意の値(ゼロである必要はありません)になる可能性があり、したがって、このプログラムは、必要なことをほとんど伝えることができます。

その小さな問題を修正したら、喜んでさらにチャットします - paxdiablo8 人のユニークなキャラクターがいます。ただし、事前に警告しておく必要があります。私は「彼女」ではありません:-)

于 2015-05-15T07:47:28.210 に答える
1
int a[1000] = {0};

a[1000]これは0sで埋める方法です。

配列が部分的に初期化されている場合、初期化されていない要素は適切な型 ( https://stackoverflow.com/a/2589751/3235496 ) の値 0 を受け取ります。


if (!a[k])

kが「すでに見た文字」であるかどうかをチェックし、それ以上の のインクリメントをスキップしますans


x & 1

が偶数xか奇数かを調べます (最後のビットをチェックします)。数値が偶数か奇数かを調べる最速の方法は何ですか? をご覧ください。詳細については。

そう

puts(ans&1 ? "IGNORE HIM!" : "CHAT WITH HER!");

が奇数の場合、IGNORE HIMを出力します。ans

于 2015-05-15T07:51:42.337 に答える