【问题标题】:if statement and puts()if 语句和 puts()
【发布时间】:2015-07-27 01:15:57
【问题描述】:

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

【问题讨论】:

  • 试试这个link&amp;操作员
  • 我猜这是c - 但我不应该这样做。如果我猜错了,请删除该标签并为您的语言添加正确的标签。
  • @Damien_The_Unbeliever ,代码在 C 中。你猜对了。
  • 第一部分的答案在这里:stackoverflow.com/questions/30194598/…
  • @CoolGuy - 关键是,有太多的语言,只是因为这里有很多强烈的信号对我说“C”,我不想假设没有另一种我不知道的类 C 语言(无论出于何种原因)具有完全不同的语义。这就是为什么尽管我添加了标签,但我总是要求 OP 确认重新标记是正确的。

标签: c if-statement puts


【解决方案1】:

这是一段奇怪的代码,我不完全确定为什么它会做什么,但从技术角度来看它很容易理解(即,什么确实如此)。

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

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

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

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

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

【讨论】:

    【解决方案2】:
    int a[1000] = {0};
    

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

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


    if (!a[k])
    

    检查k 是否是“已见过的字符”,从而跳过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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 2014-03-10
      • 2011-11-11
      • 2016-03-02
      • 2016-02-29
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多