• C语言百日刷题第八天


    前言

    今天是刷题第8天,放弃不难,但坚持一定很酷~
    快来跟我一起刷题吧。
    
    • 1
    • 2

    在这里插入图片描述

    71.打印7层杨辉三角形

    打印7层杨辉三角形
    图案如下:
    在这里插入图片描述
    在这里插入图片描述
    这个题我再前几天的刷题中也写过,但是很多人私信说上次写的太简陋了,那我这次就写完整。

    通过图,可以看出。无论它是多少层的杨辉三角,它的前两层都是1,所以,无论我们会不会,都可以先把前两层搞定一下。其次,我们可以看出从第三层开始每个数等于它上方两数之和。理解了这以后,就可以来模拟一下每个数赋值的过程。
    首先应该定义一个二维数组。
    其次,把二维数组的前两层全部赋值为1,从第三层开始,中间的数应该等于上一行的前一列的数,加上,上一行当前列的数。
    画图模拟一下具体实现过程,给大家看看。为了方便,这里我就模拟一下前四层的情况。
    定义一个四行四列的二维数组:int arr[4][4]={0};

    这个时候,内存中就会开辟4*4=16个int类型的小格子,从左边第一个开始,名字分别为:
    arr[0][0]、arr[0][1]、arr[0][2]、arr[0][3]
    ………………………………………………………
    arr[3][0]、arr[3][1]、arr[3][2]、arr[3][3]

    首先,按照我们刚刚的分析,应该先把前两层初始化,及最旁边的数都初始化为1。有了思路,我们就可以利用循环,将我们想要赋值的地方初始化为1
    我们可能会写出如下代码:

    for (int i = 0; i < 4; i++)
    {
    	arr[i][0] = 1;
    	arr[i][i-1] = 1;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    乍一看,这段代码并没有问题,但实际上,当i=0时arr[i][i-1]会越界。
    所以我们应该重新改一下,扔掉0行和0列,从第一行,第一列开始。

    for (int i = 1; i <= 4; i++)
    {
    	arr[i][0] = 1;
    	arr[i][i-1] = 1;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当执行完该段代码后,我们的数组就会变成这样子:

    在这里插入图片描述

    再回到最开始,通过观察杨辉三角的性质,可以知道,从第三行开始。
    中间的数就等于上一行的前一列+上一行的当前列。

    for (int i = 3; i <= 4; i++)
    {
    	for (int j = 2; j <= i - 1; j++)
    	{
    		arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行完上面的赋值代码后,我们数组中的数,就会变成如下这个样子:
    在这里插入图片描述
    这样,杨辉三角的赋值过程就已经结束了,接下来就是打印过程了,二维数组的打印依旧二重for循环,分别控制行和列。为了把数对齐,可以设置打印五位整数,不足五位用空格补齐。

    for (i = 1; i <= 7; i++)
    {
      for (j = 1; j <= i; j++)
      {
        if (i >= j)
          {
            printf("%5d", arr[i][j]);
          }
      }
    printf("\n");
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    所以最后把代码组装起来
    因为我们要打印7层代码,使用要把4改为7,并且我们舍弃了0行0列的数组,所以我们创建数组的时候要创建的稍微大一点:

    #include 
    int main()
    {
        int i = 0;
        int j = 0;
    int arr[10][10]={0};
       //赋值
        for (i = 1; i <= 7; i++)
        {
            arr[i][1] = arr[i][i] = 1;
        }
        for (i = 3; i <= 7; i++)
        {
            for (j = 2; j <= i - 1; j++)
            {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
    }
        //打印
        for (i = 1; i <= 7; i++)
        {
            for (j = 1; j <= i; j++)
            {
                if(i>=j)
                		printf("%5d", arr[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    72.重新排列数组

    在这里插入图片描述

    /**
     * Note: The returned array must be malloced, assume caller calls free().
     */
    int* shuffle(int* nums, int numsSize, int n, int* returnSize)
    {
        int * ret = (int*)malloc(sizeof(int)*numsSize);
        for(int i = 0;i<numsSize;i++)
        {
            if(i&1)
            {
                ret[i]=nums[n+i/2];
            }
            else
            {
                ret[i]=nums[(i+1)/2];
            }
        }
        *returnSize=numsSize;
        return  ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    解释几个可能有疑惑的点:
    1、(i&1) 是按位 与 运算,相当于取出 i 的2 进制数值的个位数。如果 i 是 十进制的奇数那么i&1得1,相反如果i是 十进制的偶数,i&1 得 0。
    2.返回的数组必须是通过malloc进行内存分配的,调用者会对他进行free操作。

    73.冒泡排序

    有下面一列数据:
    {0,-7,-9,9,2,51,7,14,35,37,49,43,41,1,3}
    编写程序,用冒泡法将其按由小到大的顺序排列进数组ax[15]中。

    冒泡排序:冒泡排序其实就是一直和旁边比,如果比旁边大,就交换位置,一直这样交换,直到完全排序完了为止。

    接下来,我们就自己先定义一个冒泡排序函数:

    void bubble_sort(int arr[], int sz)//sz表示数组元素个数
    {
    	for (int i = 0; i < sz - 1; i++)
    	{
    		for (int j = 0; j < sz - 1 - i; j++)
    		{
    			if (arr[j] > arr[j + 1])
    			{
    				int t = arr[j];
    				arr[j] = arr[j + 1];
    				arr[j + 1] = t;
    			}
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    有了冒泡排序函数后这道题就非常简单了。

    #include
    void bubble_sort(int arr[], int sz)
    {
    	for (int i = 0; i < sz - 1; i++)
    	{
    		for (int j = 0; j < sz - 1 - i; j++)
    		{
    			if (arr[j] > arr[j + 1])
    			{
    				int t = arr[j];
    				arr[j] = arr[j + 1];
    				arr[j + 1] = t;
    			}
    		}
    	}
    }
    int main()
    {
    	int arr[15] = { 0,-7,-9,9,2,51,7,14,35,37,49,43,41,1,3 };
    	int ax[15] = { 0 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	bubble_sort(arr, sz);
    	for (int i = 0; i < 15; i++)
    	{
    		ax[i] = arr[i];
    	}
    	for (int j = 0; j < 15; j++)
    	{
    		printf("%d  ", ax[j]);
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    74.将数字变成0的操作次数

    在这里插入图片描述

    int numberOfSteps(int num) 
    {
    	if (num == 0)
    	{
    		return 0;
    	}
    	if (num % 2 == 1)
    	{
    		return numberOfSteps(num - 1) + 1;
    	}
    	else
    	{
    		return numberOfSteps(num / 2) + 1;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这道题的操作方法其实是差不多的,对于这种基本新问题和旧问题思路一样的题,可以使用递归。
    但是,递归一定要有明确的截至条件,并且每次递归后都会更加接近这个截至条件。

    75.四叶玫瑰数

    在这里插入图片描述
    在这里插入图片描述
    分析:使用循环,获取每个位上的数,最后再使用pow函数计算出它们各个位数的四次方,再相加。
    如果有等于它,那么这个数就是四叶玫瑰数。

    #include 
    #include 
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=n;i<=m;i++)
        {
            int a=i%10;
            int b=i/10%10;
            int c=i/100%10;
            int d=i/1000%10;
            if((pow(a,4)+pow(b,4)+pow(c,4)+pow(d,4))==i)
            printf("%d ",i);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    记得注意下pow函数的使用方法:

    在这里插入图片描述

  • 相关阅读:
    DAG 的深度优先搜索标记
    通过FNN算法进行特征组合的商品推荐详细教程 有代码+数据
    web 服务搭建
    CI2454 2.4g无线MCU芯片应用
    C现代方法(第14章)笔记——预处理器
    看Spring源码不得不会的@Enable模块驱动实现原理讲解
    2022年福建工程学院暑期集训总结
    原生js 之 (DOM操作)
    ChatGPT:深度学习和机器学习的知识桥梁
    Small Tools(3) 集成Knife4j3.0.3接口文档
  • 原文地址:https://blog.csdn.net/weixin_61084441/article/details/127789540