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循环从标准输入中获取一系列字符,并且对于每个唯一的字符,将一个字符添加到变量ans中。如果为零,则表达式!a[k]将为真a[k](它们都被初始化为该状态)。

当该条件为真时,ans递增并a[k]设置为1,这意味着该值的任何更多字符都不会影响结果(该条件将永远不会再次为真)。

就语句而言,如果为奇数(设置了其低位)if,则表达式ans&1将为真。ans

因此,它似乎告诉您忽略名称中包含奇数个独特字符的人并与其他人交谈。当然,由于您实际上并没有初始化ans,所以整个事情都崩溃了,这意味着它可以是任意值(不一定是零),因此该程序几乎能够告诉您它想要的任何东西。

一旦你解决了这个小问题,我会很乐意进一步聊天 -paxdiablo有八个独特的角色。不过我应该提前警告你,我不是“她”:-)

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

这是一种a[1000]0s 填充的方法。

如果数组已部分初始化,则未初始化的元素会收到相应类型的值 0 ( https://stackoverflow.com/a/2589751/3235496 )。


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 回答