C语言学习记录(分支与循环)

       2021.10.27

       知识点总结(一些小细节):

1.if()语句中的判断条件如果是 “i == 1”(或类似的语句),千万不能写成赋值语句 “i = 1”,否则判断条件恒为真。如果if()语句作为循环体,还会造成死循环。

2.悬空else的问题。当你写了这样的代码:

我们发现程序什么都不会输出,这是因为else会与离它最近的if结合,因此if(a==1)条件为假,第一个if()语句根本不会进去。

因此我们要形成良好的写代码习惯写成如下形式:

 这样代码就一目了然,不会造成误会。

3.switch语句中,根据需要在某些case执行语句最后加上break,效果是把语句列表划分为不同的分支部分。如果忘记加break,则当前case执行语句执行完之后,会按顺序执行下一个case。

4.switch语句中的default部分可以放在case前面。

一些值得记录的题目

1.将三个整数从大到小输出。

如:输入231,输出321。

代码如下:

刚开始做这道题的时候没有思路,后来有一句话提醒了我,我们只要按顺序输出 a,b,c即可,将最大值赋值给a,将第二大的值赋值给b,将最小的值赋值给c。而不是将a,b,c三个数排序。

2.最大公约数

给定两个数,求这两个数的最大公约数。

如:输入20 40,输出20。这道题也是很经典了,有多种解法。

①辗转相除法(欧几里得算法)

算法实现:用大数对小数求余,如果余数为0,则除数就是最大公约数。如果余数不为0,则将余数作为除数,上一轮的除数作为被除数,继续求余,直到余数为0,此时最大公约数为最后一次的除数。例如:求27和6的最大公约数,用27%6=3,用6%3=0。所以最大公约数为3。

计算证明:设两个整数为a和b(a较大)。a可以表示为a=k*b+r(a,b,r都是整数,且r>=0)。假设d是a,b的一个公约数,即a和b都可以被d整除。而r=a-k*b,两边同时除以d,得r/d=a/d-k*b/d,因为a和b都可以被d整除,所以r/d也是整数,即r也能被d整除,而r=a%b,所以d也是b和a%b的公约数。因此(a和b)、(b和a%b)的公约数相等,则两者的最大公约数也相等。在算法中,第一次求余之后,将b赋给a,将a%b赋给b,继续求余,直到最后的余数为0,则最后一次的除数就是最大公约数。

代码实现:

②穷举法

算法实现:a,b两个数中,假设a较大,如果a%b=0,那么b就是最大公约数。如果a%b  !=  0,则将较小的b从b到1进行枚举,总能找到两个数的最大公约数。

代码实现:

3. 打印100~200之间的素数

我们完全把一个数n从2到n-1都除一遍,如果中间有可以整除的数,那么就不是素数,但是这样效率比较低。我们把n表示为两个数的乘积,即n=a*b,假设其中a是较小的数,如果2到a之间的整数都不能整除n,那么b到n-1之间的数就不用再去检查了,这样就节省了大量的计算时间。那么a是多少的时候,我们可以把n这个数检查完全呢,显然a=根号n的时候,我们将2到a之间的整数遍历检查之后,n是否是素数就可以得出结论。

4.分数求和

计算1/1-1/2+1/3-1/4+.....+1/99-1/100的值。

代码实现:

这道题中,我认为比较难的点就是分数前符号的变化,我甚至都在考虑(-1)的(i-1)次方了。但是在计算的式子中加入一个f = -1,并且每次循环之后变号,问题就迎刃而解。

我也在网上看到别的解法,代码实现是这样的:

这里把两个数看作一个整体,然后直接相加,就不需要考虑符号的问题了。

5.求十个整数中的最大值

 代码实现如下:

在这里主要是要留意如何在数组中输入十个整数。

6.在屏幕上输出9*9乘法口诀表

代码实现如下:

之前刚接触这一类问题的时候,总觉得很难,现在回过头来,发现也不是那么难了,放这里记录一下。

7.二分查找

编写代码在一个整形有序数组中查找具体的某个数。

代码实现如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值