【C语言初阶(5)】循环练习题

这篇具有很好参考价值的文章主要介绍了【C语言初阶(5)】循环练习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 计算 n 的阶乘

阶乘

  • 某个数从 1 开始一直乘到这个数本身为止;
  • 例如:3 的阶乘就是 1 * 2 * 3 = 6;
  • n 的阶乘就是 1 * 2 * 3 … * n。

解题思路

  • 如果想要阶乘到 n 的话,就要产生 1-n 的数字,此时就需要用到循环。
  • 通过循环产生 1-n 的数字,然后把这些数字累积乘到一个数上。

代码实现

#include <stdio.h>
int main()
{
	int n, i;
	int ret = 1;//产生的1-n的数字要累乘到ret上存起来,所以ret必须初始化为1
	scanf("%d", &n);

	for (i = 1; i <= n; i++)//产生 1-n 的数字
	{
		ret *= i;//将不断产生的 1-n 的数字累乘到 ret 上
	}
	printf("%d\n", ret);
	return 0;
}

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

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

解题思路

  • 和上一题一样分别计算从 1-10 的每个数的阶乘,并把这些数全部累加到一个变量上去。

代码实现

#include <stdio.h>

int main()
{
	int sum = 0,ret = 1;
	int i, n;
	scanf("%d", &n);

	for (i = 1; i <= n; i++)
	{
		ret  *=  i;//产生从 1-n 的阶乘并且存到 ret 中
		sum += ret;//将每次产生的阶乘的结果累加到 sum 中去
	}
	printf("%d\n", sum);

	return 0;
}

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

3. 使用二分查找法查找某数

题目内容

  • 在一个有序数组中查找具体的某个数字 n。

二分查找算法介绍

二分查找

  • 每次将待查记录所在区间缩小一半;
  • 只对已经排序的数据有效。

查找过程

  • 当前数组内的数据元素是按照升序排序的。

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

  1. 设置一个查找区间初始值,low 指向第一个元素,high 指向最后一个元素。
  2. 当 low <= high 时,循环执行以下操作:
    • 设一个 mid 为 low 和 high 的中间值:mid = (low + high) / 2,当前这个数组的 mid 是下标 6 的元素 56。
    • 直接将要找的这个关键字的值 21 和 和中间位置的这个值比较一下,发现 21 < 56,说明要找的值一定在 mid 的左半边区域。要将查找范围更新到 mid 左边。
    • 则将新的 high 更新为:key < mid 则:high = mid - 1,因为中间位置56比较过了,不是这家伙。

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

  1. 继续拿 mid 的值和 21 比较,发现 19 < 21,说明待查找的值在 mid 的右边,将 low 更新,key > mid 则: low = mid +1
  2. 然后再取找中间位置,low是 4 high 是 5,mid 的值就是4。

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

  1. 拿 key 的值 21 和 mid 的值比较,发现 mid == key 则:return mid

如果要找的值不在数组中

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构
c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

  • 查找到最后 low 会大于 high 上下限交换了,此时说明数组中没有俺们要找的数。
  • 折半查找结束条件:high < low
    • 因为这样就说明 high 和 low 之间已经没有元素可以被查找了。

二分查找特点

  • 在数据越多的时候效率越高,假设要 40 亿的数据中查找,第一次就能去掉20亿的数据。
  • 待查找的数据必须是有序的。

代码实现

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组中有多少个元素
	int low = 0,high = sz - 1;//high指向的是最后一个元素的下标,所以要 sz -1
	int n;

	printf("请输入要查找的数:");
	scanf("%d", &n);
	while (low <= high)//这个循环条件说明两者之间还有元素未被查找
	{
		int mid = (low + high) / 2;//这一步必须要写进循环里,不然 mid 无法更新
		if (arr[mid] > n)//如果中间值大于要查找的值,则去 mid 的左半区域去找
		{
			high = mid-1;
		}
		else if (arr[mid] < n)//如果中间值小于要查找的值,则去 mid 的右半区域寻找
		{
			low = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			break;//已经找到了,再继续找就没意义了
		}
	}
	if (low > high)//中间已经没有元素可以被查找了
	{
		printf("找不到了\n");
	}
	return 0;
}

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

4. 演示字符移动

题目内容

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

题目分析

  • 假设最终要打印出 hello word!,要演示出的效果就是下面这样;
***********
h*********!
he*******d!
hel*****rd!
hell***ord!
hello*word!
hello word!

解题思路

  1. 创建两个数组,arr1 用来存 hello word!,arr2 用来存放 ***********。
  2. 找出两个字符串数组最右端及最左端字符的数组下标。
  3. 控制左右两端的下标,将 arr1 左右两端的字符从外向里,依次赋值到 arr2 对应的位置上去。

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构

代码实现

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "hello word!";
	char arr2[] = "***********";
	int left = 0;
	int right = strlen(arr1) - 1;//要拿到的是字符串数组的最后一个元素的下标

	printf("%s\n", arr2);
	
	while(left<=right)//让 arr1 数组中的左右两端的元素向中间移动,然后依次赋给arr2
	{	
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++; right--;
		printf("%s\n", arr2);	
	}
	return 0;
}

5. 模拟用户登录场景

题目内容

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

代码实现

#include <stdio.h>
#include <string.h>
int main()
{
	int i;
	char arr1[] = "5201314";
	char password[20];

	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);//数组名已经是地址了,此处不需要 &password 了

		//使用 strcmp 来比较两个字符串是否相等,引用头文件 string.h
		//如果两个字符串相等,则 strcmp 的返回值为 0(假)
	
		if (!strcmp(password, arr1))//如果相等则返回的是 0 (假),用 ! 把假变成真
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误,请重试\n");
		}
	}
	if (3 == i)
	{
		printf("你已输错3次,已退出程序!\n");
	}
	return 0;
}

c语言,C语言程序设计从入门到进阶,c语言,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-515846.html

到了这里,关于【C语言初阶(5)】循环练习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++ 程序设计】实战:C++ 实践练习题(1~10)

    目录 01. 二维数组反对角线之和 02. 奇偶性  03. 指针与变量 04. 员工薪资  05. 整型值(%4d 进行格式化) 06. 求三个数中的最大值和最小值 07. 同一字母次数统计 08. 字符串回文判断 09. 闰年判断 10. 交换两个双精度数 【代码详解】 以上代码 计算的是 反对角线(从右上角到左下

    2024年02月14日
    浏览(39)
  • C语言循环结构一些重要的练习题(较为基础的)

    循环结构 1.求累加和问题 2.输出字母A-Z 3.输入正整数n,计算并输出n! 4.将一个正整数倒序输出 5.打印九九乘法表 6.输出三角形、菱形 7.continue语句和break语句 8.输出100-200之间不能被3整除的数 9.求Pi的值,根据 10.求斐波那契数列前k项的值 11.判断一个数是否为素数 12.输出特定

    2023年04月08日
    浏览(41)
  • 《Lua程序设计第四版》 第一部分自做练习题答案

    Lua程序设计第四版第一部分语言基础自做练习题答案,带⭐为重点。 运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题 输入负数,程序会死循环,修改如下 分别使用-l参数和dofile运行twice示例,并感受你喜欢哪种方式 载入库,在 lua解释

    2024年02月13日
    浏览(52)
  • 《Lua程序设计第四版》 第二部分14~17章自做练习题答案

    Lua程序设计第四版第二部分编程实操自做练习题答案,带⭐为重点。 该函数用于两个稀疏矩阵相加 改写队列的实现,使得当队列为空时两个索引都返回0 修改图所用的数据结构,使得图可以保存每条边的标签。该数据结构应该使用包括两个字段的对象来表示每一条边,即边的

    2024年02月13日
    浏览(48)
  • 《Lua程序设计第四版》 第二部分9~13章自做练习题答案

    Lua程序设计第四版第二部分编程实操自做练习题答案,带⭐为重点。 请编写一个函数integral,该函数以一个函数f为参数并返回其积分的近似值 使用右矩阵法近似积分值 如下代码段将输出什么结果 编写练习5.4的柯里化版本 柯里化(Currying)是把接受 多个参数 的函数变换成

    2024年02月13日
    浏览(88)
  • 《Lua程序设计第四版》 第一部分前8章自做练习题答案

    Lua程序设计第四版第一部分语言基础自做练习题答案,带⭐为重点。 运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题 输入负数,程序会死循环,修改如下 分别使用-l参数和dofile运行twice示例,并感受你喜欢哪种方式 载入库,在 lua解释

    2024年02月13日
    浏览(161)
  • 循环结构(含练习题)

    当循环次数或范围确定时,多用for循环,反之多用while循环 循环结构一般由四部分组成: 初始化语句,在循环开始最初执行,并且只执行一次 条件判断、步进语句、循环体 for循环,循环体可以执行零次或多次 每执行一次循环体,就会执行一次步进语句 foreach循环,JDK 5 新特

    2024年02月19日
    浏览(40)
  • C 语言练习题更新

    目录(先不要看答案,首先自己做才能更好的领悟,做不来没关系) 题目一:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。 题目

    2024年02月14日
    浏览(45)
  • C语言之练习题

    欢迎来到我的: 世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 这期文章由:两题问答题+四道编程题;小孩在文章中写有详细解题思路,感谢大家支持支持。 思路: 首先我们要知道 x=x(x-1) 的含义; 假设x=3;也就是 011 ; 而x-1=2;是 010 ;

    2024年02月10日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包