【C语言】入门必看之循环练习(含二分查找动图)

纸上得来终觉浅, 绝知此事要躬行。
主页:June-Frost
专栏:C语言
⚡注:此篇文章的 代码风格部分 将根据《高质量 C++/C 编程指南》 —— 林锐 进行说明。该部分将用紫色表示
【C语言】入门必看之循环练习(含二分查找动图)_第1张图片

该篇将对循环语句进行简单练习。

文章目录:

    • 一个小tip:if的风格
    • 二分查找
    • 计算1!+2!+3!+....+n!
    • 实现多个字符从两边向中间汇聚


一个小tip:if的风格

if 中与零值的比较:
布尔变量:

不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较

因为TURE的值没有统一的标准,所以对于布尔变量好的书写风格为:

if(num) 这里表示num为真
if(!num)这里表示num为假
整形变量
较好的书写风格:
if(num == 0)
if(num != 0)
指针变量
较好的书写风格:
if(num == NULL)
if(num != NULL)
尽管 NULL的值和0相同,但是意义不同。
这样的风格不会让别人误解变量的类型。

另外,有时为了防止将 if(num == 0) 写成if(num = 0) ,可以将变量放在后面,即if(0 == num) ,就算写成了if(0 = num),因为0是常量,不能被赋值,当程序运行起来后,编译器会报错,可以很快发现问题。

大家如果有兴趣,可以在 《高质量 C++/C 编程指南》 —— 林锐 里了解。


二分查找

以下为二分查找的思维动图:
查找有序数组 元素 7 的下标
【C语言】入门必看之循环练习(含二分查找动图)_第2张图片
所以我们可以将核心分为3步:

  1. 确定查找范围的左右下标,left和right
  2. 根据左右下标(left 和 right),求出中间元素的下标;
  3. 根据mid指定的元素,进行比较,如果相同返回mid,不同就调整left和right,确定最新的范围。

代码如下:

#include
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 0;//作为查找标志
	while (left <= right)
	{
		int mid = (right + left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;//调整范围
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;//调整范围
		}
		else
		{
			flag = 1;
			printf("下标为:%d\n", mid);
			break;
		}
	}
	if (flag == 0)
	{
		printf("不存在该元素,无法找到该下标\n");
	}
	return 0;
}

计算1!+2!+3!+…+n!

在这道题中,首先要考虑如何计算一个阶乘,对于n!,其实就是将1~ n累计乘在一起就可以了,对于1~ n的数值,直接用循环就可以产生。
计算阶乘:

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1; //用来保存累乘的值 
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);
	return 0;
}

既然现在可以计算阶乘了,要计算阶乘的和,只需要用一个循环让n可以变动,再进行求和即可。

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int sum = 0;
	int j = 0;
	for (j = 1; j <= n; j++)
	{
		int ret = 1; //保证上次阶乘的结果不会在循环中累乘起来
		for (i = 1; i <= j; i++)
		{
			ret *= i;
		}
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

但是在过程中出现了大量的重复计算,都需要重新从1开始累乘,导致效率不是很高。所以我们将重复计算规避。因为 (n-1)! * n 就是 n! ,根据此,改写代码。

#include
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = 1;
	int i = 0;
	int sum = 0;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

实现多个字符从两边向中间汇聚

实现效果如下:


这个问题我们可以通过两个相同大小的数组,用循环将一个数组的内容覆盖到另一个数组上。

#include
#include
int main()
{
	char arr1[] = "Welcome to the 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);
		left++;
		right--;
		Sleep(1000);//1000毫秒
		system("cls"); 
	}
	 printf("%s\n", arr2);
	return 0;
}

用system函数可以执行系统命令,通过“cls” 来清空屏幕产生一个好的效果。


你可能感兴趣的:(c语言,c语言,算法,学习,开发语言)