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