【C语言】好题分享(1)

目录

前言

一:二分查找

我们来分析 

思路

代码实现(左右逼近)

二:打印菱形

思路

代码实现(找出行数与 “*” 的对应关系 )

结语


前言

顾名思义就是把我学习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;
    }

结语

在好题分享系列中,我会持续输出一些优质经典的题目,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!也欢迎各位在评论区友好讨论。如果觉得不错的话,麻烦您点个赞吧,十分感谢!

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值