if语句和puts()

时间:2015-05-15 07:33:04

标签: c if-statement puts

最近我在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;
}

2 个答案:

答案 0 :(得分:3)

这是一段奇怪的代码,我不确定为什么它做了它所做的事情,但从技术角度来看它很容易理解(即,它做什么

while循环从标准输入中获取一系列字符,并且对于每个唯一的字符,将一个字符添加到ans变量。如果!a[k]为零,则表达式a[k]将为真(它们全部初始化为此状态)。

当该条件为真时,ans会递增,a[k]会设置为1,这意味着该值的任何其他字符都不会影响结果(条件胜出&#39;永远都是真的。)

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

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

一旦您修复这个小问题,我就会很乐意进一步聊天 - paxdiablo有八个独特的字符。我应该提前警告你,我不是&#34;她&#34; : - )

答案 1 :(得分:1)

int a[1000] = {0};

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

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

if (!a[k])

检查k是否是&#34;已经看过的字符&#34;,从而跳过ans的进一步增量。

x & 1

查找x是偶数还是奇数(检查最后一位)。您可以查看What is the fastest way to find if a number is even or odd?了解更多详情。

所以

puts(ans&1 ? "IGNORE HIM!" : "CHAT WITH HER!");
ans为奇数时,

打印 IGNORE HIM