草庐IT

「浙江理工大学ACM入队200题系列」问题 K: 零基础学C/C++84——奇偶ASCII值判断

孤星·璀璨 2023-03-28 原文

本题是浙江理工大学ACM入队200题第八套中的K题

我们先来看一下这题的题面.

题面

题目描述

任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO;

例如,字符A的ASCII值是65,则输出YES,若输入字符B(ASCII值是66),则输出NO

输入

输入为多组测试数据。

输入一个字符

输出

如果其ASCII值为奇数,则输出YES,否则,输出NO

样例输入

A

样例输出

YES

题目分析

这题其实没有任何难度,但是在acm群里问的还是挺多的,出问题的地方除了对换行的处理以外基本都是不知道在C中如何获得一个字符的ASCII码值.说到底是对char类型理解不深刻.

首先科普下什么是ASCII码(以下内容来自维基百科):

在计算机中,所有的数据在存储和运算时都要使用二进制数表示。例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,这就是编码。如果不同的计算机要想互相通信而不造成混乱,那么每台计算机就必须使用相同的编码规则,于是美国有关的标准化组织就推出了ASCII编码。

ASCII是由美国国家标准学会(American National Standard Institute,ANSI)制定的,使用标准的单字节字符编码方案,用于基于文本的数据。方案起始于50年代后期,在1967年定案。它最初是美国的标准,供不同计算机在相互通信时需共同遵守的西文字符编码标准。现已被国际标准化组织(International Organization for Standardization,ISO)定为国际标准(ISO/IEC 646),适用于所有拉丁字母。

我们知道,在C语言中存储一个字符的时候,我们使用char类型.但是不知道大家还记不记得,我们讨论数值类型的时候,我们也会说到char类型,说它是占用1个字节的数值型.

那这不矛盾吗?为啥同一个类型即是数值又是字符呢?

少年,你还是太年轻了,连波粒二象性都有了,区区一个char不能有"二象性"嘛?

在C中,如果你把char当成数值型使用(运算、用%d输出等),那么它就表现为一个数值,而当你把它作为一个字符型来使用时(作为字符串的一部分,用%c输出等),他就表现为一个字符.

比如如下代码:

	char c = 65;
	printf("%c\n", c); // 输出字符a
	printf("%d\n", (int)c); // 输出数值65(char没有自己专用格式字符,这里强制转型后用%d(强制转型仅仅是因为没有对应的格式字符而已,如果有一个对应的格式字符便可以直接输出这个数值了))
	c = 'a' + 3; // 此处'a'表现为一个整数,值为a的ASCII码值(65),然后+3,结果为68,存入变量a中
	printf("%d\n", (int)c); // 输出数值68
	printf("%c\n", c); // 输出字符d('d'的ASCII码为67,所以前面的加法从字符的角度也可以理解成顺着ASCII码表往后第n个字符)

明白了char的这个特殊的"二象性",这题的代码就很好写了吧?没错,和对一个整数判断奇偶数一模一样,因为在取模时char表现为一个整数,而且就是这个字符的ASCII码值.


常见错误

解决完char的问题之后,欢迎来到下一个乱葬岗.

很多朋友按照上面的思路写完代码,信心满满提交上去,迎头一个WA,而且通过率还是0%.


不想丸辣!

原因相对比较复杂,我们这里比较浅显的说明一下.

在我们输入数据的时候,在一组数据输完之后,是通过按下回车来完成把数据输入进去的,对吧?(不打回车就不会读进去,不用管本质,接着看,下同)

然而很不幸的是,你键入的这个回车,当你使用scanf中使用%c时,它也被当成一个字符读进来.这会导致你的一次输入出现以下情况:

(^Zctrl+Z,表示输入结束,此时scanf会返回EOF)

由于异常读入的回车,导致一次输入两次输出(这个问题在Java中似乎也有,在不使用Scanner对象包装Systm.in的时候,也会异常读入输入结尾的换行)

那怎么解决捏?方法有很多,这边不展开讲了,就说一种最容易的.

在相信很多朋友都已经隐约感受到了,scanf的格式控制字符中,空格似乎不仅仅代表一个空格.事实上,在空格代表的是一个空白字符,空格属于一个空白字符,啥也没有也属于一个空白字符,而换行,也属于一个空白字符.所以我们可以通过使用" %c"来滤掉空格.

相信会用getchar函数的朋友这个时候要问了,不就是一个换行嘛?换行不就是\n嘛,一个字符,我直接用一个getchar把它读了不就行了.

思路确实可行,本地跑也是完全没有问题的,但是这样提交上去依旧是WA.因为你把换行想简单了.

实际上,换行不只有\n一种写法,也可能是\r\n,具体不展开,总之在这题的评测机输入中,你必须连续调用两次getchar函数才可以读掉换行,在评测机上AC.但是这会导致你本地跑不了(因为本地换行是\n,具体原因不解释).所以为什么不在scanf里打一个空格捏?简单又可行.

这个换行问题在后续还是会碰到的,特别是scanfgets一起使用的时候.这边建议有空学一学C++的cin对象,用cin对象即可完美解决换行的问题.不过记得还要学一下怎么关闭cinscanf的同步,不然代码的常数会比较大(人话:比较慢).


参考代码

下面给出了我自己做这道题时候的完整代码:
(仅作为参考,一定要自己写一下奥,作弊没意思,害人又害己)

#include <stdio.h>

int main()
{
	char c;
	while (~scanf(" %c", &c)) // 利用空格代表空白字符,去掉换行,同时保证没有换行时代码也是正确的.看不懂~(按位非)就写scanf(" %c", &c) != EOF
	{
		if (c % 2) // 即奇数(养成习惯不要==1,因为负奇数,虽然这里不可能会是负数)
		{
			printf("YES\n");
		}
		else // 即偶数
		{
			printf("NO\n");
		}
	}
	return 0;
}

"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德

这篇题解就到这里了,各位朋友如果有问题欢迎到acm成员群中提问哦!

有关「浙江理工大学ACM入队200题系列」问题 K: 零基础学C/C++84——奇偶ASCII值判断的更多相关文章

  1. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  2. ruby - 如何将一段文本可逆地压缩成更少的 ASCII 字符? - 2

    我想获取任意的ASCII文本字符串,例如“Helloworld”,并将其压缩为字符数较少(尽可能少)的版本,但要采用可以解压缩的方式。压缩版本应仅由ascii字符组成。有没有一种方法可以做到这一点,尤其是在Ruby中? 最佳答案 如果知道只会使用ASCII字符,那就是每个字节的低7位。通过位操作,您可以将每8个字节混合成7个字节(节省12.5%)。如果您可以将其放入更小的范围(仅限64个有效字符),则可以删除另一个字节。但是,因为您希望压缩形式也只包含ASCII字符,所以会丢失一个字节-除非您的输入可以限制为64个字符(例如,有损压

  3. ruby-on-rails - RVM、Ruby 1.9.2、Rails 2.3.8、Passenger 和 "invalid byte sequence in US-ASCII" - 2

    我刚刚开始从Ruby1.8.7升级到Ruby1.9.2(使用RVM)。我的所有应用程序都使用“脚本/服务器”(或“rails服务器”)和1.9.2运行,但是,只有Rails3.0.0RC应用程序可以与Passenger一起使用。Rails2.3.8应用给出的错误信息是:invalidbytesequenceinUS-ASCII我猜这是一个Passenger问题。我使用找到的RVM指南安装了Passenger2.2.15here.任何想法如何修复这个错误?谢谢。我已更新以包含堆栈跟踪:/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack

  4. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  5. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  6. 如何判断oracle是否启动及启动oracle数据库 - 2

    plsql连接Oracle超时,完犊子了肯定是服务器断电了。得马上检查Oracle服务器状态1、检查数据库是否启动su-oracle切换到Oracle用户,输入sqlplus/assysdba显示连接状态。如果末尾显示的状态是Connectedtoanidleinstance.证明未启动2、启动数据库startup启动数据库,末尾出现Databaseopened说明数据库启动成功3、查看数据库监听是否正常先quit;断开Oracle连接,使用lsnrctlstatus查看监听状态,如果出现TNS-开头的Nolistener、Connectionrefused等错误,说明监听未启动4、启动数据库

  7. 【Python】判断字符串输入合法化 - 2

    Python判断字符串输入合法化只包含数字包含数字只包含中文包含中文只包含字母包含字母只包含数字判断字符串是否只包含数字:1.str.isdecimal()如果str只包含全角数字则返回True2.str.isdigit()如果str只包含全角数字、unicode编码的数字字符串例如⑴、\u00b2此类型则返回True3.str.isnumeric()如果str只包含数字(全角、半角)则返回True包含数字判断字符串是否只包含数字:print(bool(re.search(r'\d',"12321sad")))re.search()方法扫描整个字符串,并返回第一个成功的匹配,(re.searc

  8. ruby-on-rails - Rails 在记录 200 OK 后在做什么? (调试响应时间慢) - 2

    我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro

  9. ruby-on-rails - Rails Controller 中未定义的方法呈现 - 尝试使用 200 状态代码响应 Sendgrid - 2

    我正在使用SendgridParseAPI和Griddlergem来接受传入的电子邮件。在大多数情况下,这工作正常;但是,如果您未使用状态代码200响应Sendgrid,他们将假定该应用程序未正确接收POST请求并继续尝试进行POST3天。我正在尝试使用状态代码进行响应,但遇到了问题。在常规的RESTful路由中,您可以执行类似...render:status=>200但是,我认为这必须在Controller中完成才能识别渲染方法。Griddler建议您创建一个EmailProcessor模型并使用“处理”方法来处理电子邮件。据我了解,您不能在模型中使用渲染方法。因此,我使用类方法创建

  10. ruby - open-uri 从以 iso-8859 编码的网页返回 ASCII-8BIT - 2

    我正在使用open-uri读取一个声称以iso-8859-1编码的网页。当我读取页面内容时,open-uri返回一个以ASCII-8BIT编码的字符串。open("http://www.nigella.com/recipes/view/DEVILS-FOOD-CAKE-5310"){|f|pf.content_type,f.charset,f.read.encoding}=>["text/html","iso-8859-1",#]我猜这是因为网页中的字节(或字符)\x92不是有效的iso-8859字符。http://en.wikipedia.org/wiki/ISO/IEC_8859-

随机推荐