分支语句和循环语句(习题集)

🌹作者:云小逸
📝个人主页


前言

前面我们已经讲了分支语句和循环语句,今天小逸来说一说一些经典例题帮助你巩固所学知识。
——————————————————————————————


1.计算n的阶乘

运行代码:

注意:i要从1开始,ret初始化为1,且循环条件为i<=n!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(vodi)
{
	int i = 0, n = 0;
	int ret=1;
	scanf("%d", &n);
	for (i = 1; i<=n; i++)
	{
		ret = i * ret;
	}
	printf("%d",ret);
	return 0;
}

运行结果截图:

在这里插入图片描述

2.计算1!+2!+……n!n个阶乘之和

方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(vodi)
{
	//2.计算1!+2!+……n!n个阶乘之和
	int i = 0, j=0,n = 0;
	int ret = 1,sum=0;
	scanf("%d", &n);
	for (i = 1; i <=n; i++)
	{
		ret = 1;//语句A
		for (j = 1; j <= i;j++)
		ret = j * ret;
		sum += ret;
	}
	printf("%d", sum);
	return 0;
}

经典错误:语句A忘记写上,导致ret仍保留上一次运算的结果,产生累加效果!!!

错误情况截图:

在这里插入图片描述

正确情况截图:

在这里插入图片描述

方法二:

方法一时间复杂度较高为O(N^2),故改进:

运行代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(vodi)
{
	//2.计算1!+2!+……n!n个阶乘之和 方法二:
	int i = 0, n = 0;
	int ret = 1, sum = 0;
	scanf("%d", &n);
	for (i = 1; i <=n; i++)
	{
		ret = ret * i;
		sum += ret;
	}
	printf("%d", sum);
	return 0;
}

运行结果截图:

在这里插入图片描述

3.二分查找(折半查找)

运行代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(vodi)
{
	//二分查找:
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]);
	int x = 0;
	scanf("%d", &x);
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > x)
			right = mid - 1;
		else if (arr[mid] < x)
			left = mid + 1;
		else
		{
			printf("Find!,the subscript is %d", mid);
			break;
		}
	}
	if (left > right)
		printf("NO Find!\n");
	return 0;
}

运行结果截图

在这里插入图片描述

注意:

当(left+right)/2大于Int的取值范围时,则会导致数据溢出,故这种写法并不是完美的,
可以将int mid = (left + right) / 2;改为:int mid=left+(right-left)/2;这样就可以完美的解决bug了!!!

在这里插入图片描述
画一个这个图,希望帮助大家理解!

4.编写代码,演示多个字符从两端移动,向中间汇聚

运行代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main(void)
{
	//4.编写代码,演示多个字符从两端移动,向中间汇聚
	char arr1[] = "welcome to bit";
	char arr2[] = "##############";
	int left = 0;
	int right = sizeof(arr1)/sizeof(arr1[0]) - 2;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(100);//S要大写
		left++;
		right--;
	}
	return 0;
}

解释:sizeof(arr1)/sizeof(arr1[0]) 是表示数组含元素的个数!

运行结果截图:

在这里插入图片描述

5.模拟用户登录情况,并且只能登录三次(只允许输入三次密码,如果密码正确,则提示登录成功,若三次均输入错误,则退出程序)

运行代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(vodi)
{
	//5.模拟用户登录情况,并且只能登录三次
	//(只允许输入三次密码,如果密码正确,则提示登录成功,若三次均输入错误,则退出程序)
	int i = 0;
	char passward[20] = { 0 };
	while (i < 3)
	{
		scanf("%s", passward);
		if (strcmp(passward, "abcdef") == 0)
		{
			printf("Right!\n");
			break;
		}
		else
			printf("ERROR!Enter again!\n");
		i++;
	}
	if(3==i)
	printf("The input is incorrect for three times!\n");
	return 0;
}

PS:调用strcmp时记得要用#include<string.h>头文件

运行结果截图:

在这里插入图片描述

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
**

大学生最好的状态是什么?

**

1、享受一个人的生活。

《生活大爆炸》里有这么一段话:

或许你在学校格格不入,或许你是学校里最矮小、最胖的,或最怪的孩子,或许你没有任何朋友…… 其实,这根本无所谓
重点是,那些你独自一人度过的时间,比如:组装电脑,练习大提琴……其实你真正在做的是让自己变有趣
等有天别人终于注意到你时,他们会发现一个比他们想象中更酷的人。 没有朋友没关系,一个人也没关系。

低质量的社交,远不如提升自己来得有用。

一个真正有趣的人,纵然孤身一人,心里也会有千军万马。

在大学,有一个自己的小爱好,不需要很厉害,感觉开心就好;有一份平常的工作,收入可能不会很多,能提升自己就好;有自己的一个小金库,不需要有多少钱,能偶尔给自己买身衣服吃顿火锅就好

结束了一天的课业,吃完晚饭,一个人去图书馆看会儿书,不用很久,能有所获就好;一个人在操场上漫步,不用很赶,听着歌慢慢走,然后回到宿舍洗个澡,换身衣服,靠在床边玩会儿手机,慢慢进入梦乡……没有牵挂没有羁绊,足矣……

2、再好的身体,也不如规律的生活。
23点睡觉,6点起床。早起的人总会感觉到生活的美好,乐观向上,自带魔力。

3、不必卑微,不必事事在意他人的目光。

三观不合的人,你做再多他也不会认同你。

大大方方去图书馆学习,大大方方地做自己想做的事,再多的冷嘲热讽都会在你成功的那一刻沦为他们自己的笑柄。

做好自己,不卑不亢,就够了

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云小逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值