目录
前言
顾名思义就是把我学习C语言的过程中,遇到的一些自认为的好题分享出来,废话少说,上题!
一:二分查找
在我写的前几篇博客 —— 猜数字小游戏 当中,游戏玩法非常简单,就是从 1 - 100 中猜到正确的数字。如果是你话,你会怎么猜? 1,2,3 . . .这样猜吗?这样猜起来十分低效;一般我们都会从中间数字猜起,比如:50,再根据提示来继续往下折半猜,这就是二分查找的思路。
题目:在一个升序的整型数组中查找一个数,如果找到则输出它的下标,没找到就输出 “找不到该数”
我们来分析
- 题目要求我们在一个数组里找,那肯定要遍历数组,一一比对
- 数组是升序数组,那我们就可以用二分查找来做这道题
思路
- 选择数组中间值来和目标值进行比较,如果相等就成功找到,输出该数的下标值
- 如果不相等:那就用中间值与目标值进行比较,这时候得分为两种情况
- 当中间值大于目标值,则排除右边的数,再在左半部分取新的中间值
- 当中间值小于目标值,则排除左边的数,再在右半部分取新的中间值
将该过程循环下去,直至左右两端逼近到一起,此时若还没找,则输出 “找不到该数”
代码实现(左右逼近)
#include <stdio.h>
int main()
{
//预设数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//确定好左右两端下标
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int k = 0;
//要找的数字
scanf("%d", &k);
while (left <= right)
{
//mid始终为中间值的下标
int mid = (left + right) / 2;
if (arr[mid] == k)
{
printf("找到了,数字是%d\n", arr[mid]);
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
//没找到
if (left > right)
{
printf("没找到\n");
}
return 0;
}
二:打印菱形
题目:输入一个整数,用 “*” 打印出菱形,每个 “*” 后面都有一个空格
思路
我们可以将菱形分为上下两个部分来打印,当输入的整数 n 为二时,上半部分为三行,并且 “*” 也是从上往下递增,并且为正三角形,以中间对称分布
下半部分为两行, “*” 从上往下递减,为倒正三角形,同样也是对称分布
代码实现(找出行数与 “*” 的对应关系 )
#include <stdio.h>
int main()
{
int a, b;
int n;
scanf("%d", &n);
int i, j;
//打印上半部分
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n - i + 1; j++)
{
printf(" ");
}
for(j = 1; j <= i; j++)
{
//* 后面记得打印空格
printf("* ");
}
printf("\n");
}
//打印下半部分
for(i = 1; i <= n + 1; i++)
{
for(j = 1; j <= i - 1; j++)
{
printf(" ");
}
for(j = 1; j <= n - i + 2 ; j++)
{
//* 后面记得打印空格
printf("* ");
}
printf("\n");
}
return 0;
}
结语
在好题分享系列中,我会持续输出一些优质经典的题目,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!也欢迎各位在评论区友好讨论。如果觉得不错的话,麻烦您点个赞吧,十分感谢!