1.最大公约数和最小公倍数的组合问题
(1)在调试的过程中涉及到很大的数据,我们我们在定义变量的时候定义为long long类型
(2)这个里面我们自定义了max2用来求最大公约数,min2用来求最小公倍数
(3)我们核心是要求出最大公约数,有了最大公约数和2个原始数据,我们可以让2个数的乘积除以最大公约数,就可以得到最小公倍数;
(4)在求出最大公约数的过程中,我们使用辗转相除法,如果a%b的结果不是0,就把b的值赋值给a,把余数赋值给b,直到最后的余数是0,我们最后返回b的值,就是最大公约数。
2.改数字游戏
这个游戏还是利用循环,取余数,除法操作,不断的累加等一系列的方法进行解决实际问题
这个题目时输入数据,判断他的每个位上面的奇偶情况,但是我们要注意的是不同的数位,他所代表的数量级是不相同的;
(1)这个里面我们设置b为最后的输出结果,如果这个数位上面的数据是偶数,无论他的位数多高,都是0,这个地方我们使用if循环,满足奇数的条件就乘上对应的数量级,不满足就不进行循环里的部分,我们使用n来控制数量级,无论是否满足条件,都要进行乘10操作,因为相邻的数位之间的差距是10这个量级;
(2)我们的n%2==1既是判断这个数是否为奇数,也是判断这个数据的最低位是不是奇数,如果是就加上1,不是我们就要判断比他高一位的数据,这个时候我们先要把i*10,这个将来要乘上10位上的数,进行除10,把已经判断的舍去,这样十位就变成了最低位,一次循环下去。
3.判断输入的字符是否为字母(包括大小写)
在牛客网上面,有两道题目都是判断这个输入的字符是否是字母,这个让我很意外,认为一个相同的知识点为什么要考察2遍呢,向老师请教了很长时间才发现这个里面暗藏玄机,发现自己以前并不注意的细节,请听我细细道来:
我们首先来认识一下这个函数,可以用来判断输入的字符是否为大小写,如果是大写或者小写,就会返回true(上面写的返回值是int,实际上是没有区别的,因为C语言里面1代表true,0代表假,这两者本质上都表示一个意思),如果既不是大写,也不是小写就会返回false;
这个库函数的使用需要包含我们的头文件<ctype.h>这样就可以进行判断;
(1)单个输入
下面的这个题目是牛客网上面我做的第一道关于判断输入字符是否为字母的编程题目:
这个代码的意思就是如果是字母,就会输出yes,否则就会输出no;
当然,我们也可以像下面的这样写的更容易理解一些:
(2)多组循环输入
我们首先看一下我的错误案例:
这段代码错误的原因就是因为无法过滤掉里面的空格所以他把空格也判断了一遍并且输出了,因此我们要想办法解决输入的字符之间的空格的过滤;
我在这里提供2种解决方案:
第一种就是在输入的语句里面的%c的前面加上空格,就可以过滤掉无用的空格,其实我们自己可以进行尝试,这个空格无论是加在%c的前面还是后面,无论是加一个还是加多个,都是可以实现这个过滤的效果的,我们任选一种写法实现这个功能;
还有一种写法就是scanf语句里面的内容正常写,我们加上一句getchar(),这种做法同样可以实现过滤掉空白字符的功能;为什么会这样呢?我们有必要重新认识一下scanf和getchar的特殊用法:
对于scanf这个库函数,我们首先要明确,scanf遇到空格与回车时,会结束读取,一般scanf读走输入数据后,会留下如\n等的字符,如果我们还要再次调用scanf的话,缓冲区中还有\n,此时scanf不等我们输入数据,就把\n读走了,从而不能达到我们的目的。下面看这个例子:
这个时候,如果我们输入2个字符,字符之间有空格,我们就无法输出空格后面的字符;
加上getchar()之后,这个问题就可以被解决了,由此可见getchar()可以过滤空格;那这道题目的循环判断就不难理解了。