• c语言:查漏补缺(二)


    前言

    这篇是对分支与循环语句等知识的练习以及补充,让我们一起练起来吧

    1.计算n的阶乘

    #include
    
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	int ret = 1;
    	int i = 0;
    	for (i = 1; i <= n; i++)
    	{
    		ret *= i;
    	}
    	printf("%d", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    2.计算1!+2!+3!+…+10!

    #include
    
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	int i = 0;
    	int j = 0;
    	int ret = 1;
    	int sum = 0;
    	for (i = 1; i <= n; i++)
    	{
    		ret = 1;
    		for (j = 1; j <= i; j++)
    		{
    			ret *= j;
    		}
    		sum += ret;
    	}
    	printf("%d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    大家看到上面的方法虽然可以达到要求,但是效率低下,我们可以优化一下代码:

    #include
    
    int main()
    {
    	int n = 0;
    	scanf("%d", &n);
    	int i = 0;
    	int ret = 1;
    	int sum = 0;
    	for (i = 1; i <= n; i++)
    	{
    		ret *= i;
    		sum += ret;
    	}
    	printf("%d", sum);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    像上面这样我们就可以在一层循环里面解决问题。

    3.在一个有序数组中查找具体的某个数字n(二分查找安全版)

    二分查找具体的思路和实现,咱们以前已经讨论过,大家想要看一下可以去看:c语言基础篇:二分查找
    这里是对二分查找的一种安全方法的讲述

    大家有没有想过如果left和right的值是一个很大很大的数,虽然它们两个没有超过整型的范围,但是它们两个加起来就会超过整型的范围,那么这个时候我们该如何改变就能使代码变得安全起来?

    像下面这样将(right - left)/ 2加在left上赋给mid这样mid就不会超过整型的范围对代码进行安全保护。
    在这里插入图片描述

    代码如下:

    #include
    
    int main()
    {
    	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
    	int left = 0;
    	int right = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
    	int n = 7;
    	int mid = 0;
    	while (left <= right)//如果left > right说明没有这个元素
    	{
    		mid = left + (right - left) / 2;
    		if (arr[mid] < n)
    		{
    			left = mid + 1;
    		}
    		else if (arr[mid] > n)
    		{
    			right = mid - 1;
    		}
    		else
    		{
    			printf("找到了,下标为%d\n", mid);
    			break;
    		}
    		if (left > right)
    		{
    			printf("找不到\n");
    		}
    	}
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

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

    #include
    #include
    #include
    #include
    
    //Hello World!
    //############
    //H##########!
    //He########d!
    //Hel######ld!
    //.....
    //Hello World!
    
    
    int main()
    {
    	char arr1[] = "Hello World!";
    	char arr2[] = "############";
    
    	int left = 0;
    	int right = strlen(arr1) - 1;
    	while (left <= right)
    	{
    		arr2[left] = arr1[left];
    		arr2[right] = arr1[right];
    		printf("%s\n", arr2);
    
    		Sleep(1000);//window下Sleep函数参数的单位使毫秒
    		system("cls");
    		left++;
    		right--;
    	}
    	printf("%s\n", arr2);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    5.编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

    //编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则
    //提示登录成,如果三次均输入错误,则退出程序。
    
    //假设正确的密码是:"bitbit"
    //string compare - strcmp
    #include
    #include 
    
    //C语言中有字符串吗? - 有 ""
    //C语言中有字符串类型吗? 没有
    //string - C++
    //
    //strcmp 的返回值
    //>0 
    //<0 
    //==0
    int main()
    {
    	int i = 0;
    	char password[20] = { 0 };
    	for (i = 0; i < 3; i++)
    	{
    		printf("请输入密码:>");
    		scanf("%s", password);
    		//判断密码正确性
    		if (strcmp(password, "bitbit") == 0)
    		{
    			printf("密码正确,登陆成功\n");
    			break;
    		}
    		else
    		{
    			printf("密码错误\n");
    		}
    	}
    	if (i == 3)
    	{
    		printf("三次密码错误,退出程序\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

  • 相关阅读:
    java笔记
    超几何分布 MIA MAP Multimodal-intersection-analysis-MIA-
    【datawhale202206】pyTorch推荐系统:多任务学习 ESMM&MMOE
    free-mybatis-plugin插件下载
    fork()写时复制原理
    【DevOps基础篇之k8s】如何应用Kubernetes中的Role Based Access Control(RBAC)
    基于海鸥算法优化的lssvm回归预测-附代码
    Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin
    【JavaSE】类和对象(下)(访问限定符 包的概念 导入包中的类 自定义包 包的访问权限控制举例 常见的包 实例内部类 静态内部类 局部内部类 对象的打印)
    MassTransit 入门(一)
  • 原文地址:https://blog.csdn.net/weixin_61341342/article/details/125913082