【C语言解题篇】必须要会的循环试题!!

Source

目录

 

查找数字

字符从中间缩聚

密码登录

最大公约数

总结


查找数字

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

要求:找到了就打印数字所在的下标,找不到则输出:找不到。

解题关键:利用while循环,利用二分查找法,即找出每次的中间元素,当找的数比中间下标元素小时,就不用从右边找,当找的数比中间元素大时,就不用从坐边找。

代码示例:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf_s("%d", &k);//输入要查找的数字
	int i = 0;
	int left = 0;//数组首元素下标
	int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
	int right = sz - 1;//数组最后元素下标
	while (left <= right)
	{
		int mid = (left + right) / 2;//中间元素下标
		if (arr[mid] < k)//要找的数在中间元素的右边
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)//要找的数在中间元素的左边
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到了");
	}
	return 0;


}

字符从中间缩聚

要求:演示多个字符从两端移动,向中间汇聚

解题关键:

初始化两个字符串数组,数组大小必须一致,用strlen求出字符串的长度。

定义left,right作为数组第一个元素和最后一个元素的下标,将一个数组的左下标元素赋值另一个数组的左下标元素,右边也一样,然后让left++,right--。

代码示例:

#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
	char arr1[] = "welcom to bit";
	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(300);//睡眠
		//system("cls");//清空屏幕,让代码一行显示

	}
	
	return 0;
}

密码登录

编写代码实现,模拟用户登录情景,并且只能登录三次。

要求:只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序

解题关键:

for循环控制输入次数

使用strcmp(字符串比较函数)判断输入的字符串是否与密码相等,当其值为0时则表示相等,输入正确

代码示例:

#include<stdio.h>
#include<string.h>
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:\n");
		scanf("%s", password);
		if (strcmp(password, "123456") == 0)
		{
			printf("登录成功!\n"); 
			break;
		}
		else
		{
			printf("输入错误,重新输入!\n");
		}
	}

	if (3 == i)
	{
		printf("三次均输入错误,即将退出程序!\n");

	}
	return 0;
}

 


最大公约数

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

解题方法:

相减法,两个数最大公约数最大为两数中的较小值,若不是则max--

辗转相除法,利用while循环反复求余,当余数为0时,被除数则是最大公约数

代码示例:

#include<stdio.h>
int main()
{
	int m = 0;
	int n = 0;
	int c = 0;//余数
	scanf_s("%d%d", &m, &n);
	//相减法
	int max = 0;
	if (m > n)//判断两个数中的较大值
	{
		max = n;
	}
	else
	{
		max = m;
	}
	while (1)
	{
		if (m % max == 0 && n % max == 0)
			printf("%d", max);
		break;
	}
	max--;//两个数最大公约数最大为两数中的较小值,不是则max--;
	return 0;


	//辗转相除法
	while (c = m % n)//当m%n=0时,n就是最大公约数
	{
		m = n;
		n = c;

	}
	printf("%d", n);
	return 0;
	//最小公倍数=(m*n)/最大公约数
}

总结

相信这些题大家多多少少看过,解题方法也有很多,这些题对于大家掌握循环语句的知识很重要,他们也可以运用在自定义函数中求解,但是这是最基本的思路方法。如果大家感觉有帮助的话,那就请一键三连支持我吧!