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

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

题面

输入

输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。

输出

输出每组数中的所有奇数的乘积,对于测试实例,输出一行。

样例输入

3 1 2 3

4 2 3 4 5

样例输出

3

15


题目分析

这题的思路非常简单,只要遍历一遍各个输入,判断奇数然后乘起来就好了(注意记录结果的变量不要初始化为0,那样无论你怎么乘结果还是0).

常见错误思路

但是,这题有一个非常容易错的小细节,在ACM群里询问的频率也非常高,大部分询问的朋友给出的判断奇数的局部代码都是如下这样的:

	if (a % 2 == 1)
{
res *= a;
}

常见错误原因解析

很多朋友都很纳闷,对二取余为1,为啥就不是奇数了呢?

这是因为你不懂取模运算符的心.自C99起规定,如果取模操作左边的操作数是正数,则取模的结果为正数(或零),但如果取模操作左边的操作数是负数,则模除的结果为负数(或零).如果此题的数据中有负奇数,那么a % 2的计算结果是-1而不是1,所以这种判断方式是不对的!

解决方案

那如何解决呢?最直接的办法是使用或操作符连着-1一起判断,局部代码如下:

	if (a % 2 == 1 || a % 2 == -1)
{
res *= a;
}

但这样其实略显麻烦,我们可以反着来,通过判断这个数不是偶数来判断奇数,反正在整型里没有-0,不会出现问题(浮点数里有奥),局部代码如下:

	if (a % 2 == 0) // 不是偶数,就是奇数,反正偶数对2取模时无论整数结果都是0
{
res *= a;
}

当然,还有更简单的写法,这种写法基于C弱类型的特性,我个人喜欢这种写法.

我们知道,在C语言中是会进行很多自动类型转换的.或者换一步说,在C中是没有所谓布尔型(逻辑型)的(C++中有),而是用非零的数或者可以转换为非0的数的东西表示true,而用或者可以转换为0的东西表示false.

对于奇偶数判断,我们其实正是在对取模结果是零还是非零进行判断,所以我们可以直接把取模操作作为if的条件表达式,代码模板如下:

	// 判断奇数
if(a % 2) // 即a % 2的结果非零,也即奇数.
{
// 此处填写具体处理代码
} // 判断偶数
if(!(a % 2)) // 即a % 2的结果为零(非零不成立),也即偶数,注意优先级
{
// 此处填写具体处理代码
}

当然咯,如果你对位运算有所了解,这里还可以直接借助位运算来解决.如果你不知道什么是位运算并无关系,只要会写上面的代码就好了.位运算判断奇偶的代码模板如下:

	// 判断奇数
if(a & 1) // 通过&1取出二进制最低位,奇数的二进制最低位一定为1(包括负数,证明略)
{
// 此处填写具体处理代码
} // 判断偶数
if(!(a & 1)) // 通过&1取出二进制最低位,偶数的二进制最低位一定为0(包括负数,证明略),注意优先级
{
// 此处填写具体处理代码
}

参考代码

下面给出了我自己做这道题时候的完整代码:

(仅作为参考,一定要自己写一下奥,作弊没意思,害人又害己)

#include <stdio.h>

int main()
{
int n;
while (~scanf("%d", &n)) // 处理多组输入,如果你不熟悉位运算那就写成scanf("%d", &n) != EOF
{
int res = 1; // 注意不要初始化成0
for (int i = 0; i < n; i++)
{ int num;
scanf("%d", &num); if (num % 2) // num % 2的结果非零,也即奇数.
{
res *= num;
}
}
printf("%d\n", res);
}
return 0;
}

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

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

「浙江理工大学ACM入队200题系列」问题 E: 零基础学C/C++78——求奇数的乘积的更多相关文章

  1. 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解

    本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  2. 「浙江理工大学ACM入队200题系列」问题 B: 零基础学C/C++12——求平均值

    本题是浙江理工大学ACM入队200题第二套中的B题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  3. 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++85——完美数

    本题是浙江理工大学ACM入队200题第八套中的L题 我们先来看一下这题的题面. 题面 题目描述 任何一个自然数的约数中都有1和它本身,我们把小于它本身的因数叫做这个自然数的真约数. 如6的所有真约数是 ...

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

    本题是浙江理工大学ACM入队200题第八套中的K题 我们先来看一下这题的题面. 题面 题目描述 任意输入一个字符,判断其ASCII是否是奇数,若是,输出YES,否则,输出NO; 例如,字符A的ASCI ...

  5. 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路

    本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...

  6. 「浙江理工大学ACM入队200题系列」问题 L: 零基础学C/C++52——计算数列和2/1,3/2,5/3,8/5......

    本题是浙江理工大学ACM入队200题第五套中的L题 我们先来看一下这题的题面. 题面 题目描述 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13,-- 计算这个数列的前n项和.注意: ...

  7. 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排序与选择排序算法)

    本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习 ...

  8. 「浙江理工大学ACM入队200题系列」问题 H: 零基础学C/C++18——三位数反转

    本题是浙江理工大学ACM入队200题第二套中的H题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  9. [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念

    上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...

随机推荐

  1. 【MySQL】从入门到掌握4-主键与Unique

    上期:[MySQL]从入门到掌握3-WorkBench 第一章:主键 在实际开发中,我们不会使用用户名字当作主键.   因为当我们用数据库记录学生信息的时候,学生有可能重名! 我们一般会使用是个int ...

  2. Python入门系列(四)别再傻傻分不清:列表、元组、字典、集合的区别

    总结分析列表.元组.字典.集合的相同与区别之处,只有彻底分清之后,就会在应用的时候,得心应手. 四句话总结 列表是一个有序且可更改的集合,允许重复成员. 元组是一个有序且不可更改的集合,允许重复成员. ...

  3. C#实现HTTP访问类HttpHelper

    在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了.示例中的HttpHelper类使用Log4Net记录了每 ...

  4. 分布式链路追踪体验-skywalking入门使用

    背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...

  5. js中new的原理

    面向对象 在了解new的原理之前,先简单地了解一下构造函数和对象. js可以通过构造函数创建对象: function Test() { } var t = new Test(); 构造函数的首字母大写 ...

  6. 类的常成员const

    成员数据 以Human为例: 类中: 传统的初始化方式:                                                                        ...

  7. js 数组中的方法

    <!DOCTYPE html><html><head> <title>数组的方法</title> <meta charset=&quo ...

  8. 第三章:模版层 - 2:Django内置模板标签

    Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...

  9. 使用kuboard界面管理k8s集群时使用ConfigMap挂载挂载到pod容器中,映射成一个文件夹

    将 ConfigMap 作为一个数据卷(在挂载时不指定数据卷内子路径,需要指定ConfigMap的子路径)挂载到容器,此时 ConfigMap 将映射成一个文件夹,每一个 KEY 是文件夹下的文件名, ...

  10. 4.Gitlab CI 与 Kubernetes 的结合

    参考网址:https://www.qikqiak.com/post/gitlab-ci-k8s-cluster-feature/