C语言百日刷题第八天

这篇具有很好参考价值的文章主要介绍了C语言百日刷题第八天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

C语言百日刷题第八天,c语言,算法

71.打印7层杨辉三角形

打印7层杨辉三角形
图案如下:
C语言百日刷题第八天,c语言,算法
C语言百日刷题第八天,c语言,算法
这个题我再前几天的刷题中也写过,但是很多人私信说上次写的太简陋了,那我这次就写完整。

通过图,可以看出。无论它是多少层的杨辉三角,它的前两层都是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;
}

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

for (int i = 1; i <= 4; i++)
{
	arr[i][0] = 1;
	arr[i][i-1] = 1;
}

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

C语言百日刷题第八天,c语言,算法

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

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];
	}
}

执行完上面的赋值代码后,我们数组中的数,就会变成如下这个样子:
C语言百日刷题第八天,c语言,算法
这样,杨辉三角的赋值过程就已经结束了,接下来就是打印过程了,二维数组的打印依旧二重for循环,分别控制行和列。为了把数对齐,可以设置打印五位整数,不足五位用空格补齐。

for (i = 1; i <= 7; i++)
{
  for (j = 1; j <= i; j++)
  {
    if (i >= j)
      {
        printf("%5d", arr[i][j]);
      }
  }
printf("\n");
}

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

#include <stdio.h>
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;
}

72.重新排列数组

C语言百日刷题第八天,c语言,算法

/**
 * 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、(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;
			}
		}
	}
}

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

#include<stdio.h>
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]);
	}
}

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

C语言百日刷题第八天,c语言,算法

int numberOfSteps(int num) 
{
	if (num == 0)
	{
		return 0;
	}
	if (num % 2 == 1)
	{
		return numberOfSteps(num - 1) + 1;
	}
	else
	{
		return numberOfSteps(num / 2) + 1;
	}
}

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

75.四叶玫瑰数

C语言百日刷题第八天,c语言,算法
C语言百日刷题第八天,c语言,算法
分析:使用循环,获取每个位上的数,最后再使用pow函数计算出它们各个位数的四次方,再相加。
如果有等于它,那么这个数就是四叶玫瑰数。

#include <stdio.h>
#include <math.h>
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);
    }
}

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

C语言百日刷题第八天,c语言,算法文章来源地址https://www.toymoban.com/news/detail-815657.html

到了这里,关于C语言百日刷题第八天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC第八天 基本数据类型介绍

    CRect类是MFC中用于表示矩形的类。它提供了方便的方法来操作矩形的位置和大小。CRect类常用于图形绘制、窗口管理和布局等场景。 可以用于绘制矩形、椭圆、圆等图形时需要指定其位置和大小。此外,CRect类还常用于窗口管理,可以通过CRect对象来设置窗口的位置和大小。它

    2024年02月11日
    浏览(34)
  • 每日后端面试5题 第八天

    1.UDP无连接,速度快,安全性低,适合高速传输、实时广播通信等。 2.TCP面向连接,速度慢,安全性高,适合传输质量要求高、大文件等的传输,比如邮件发送等。 (还有:TCP只能是一对一的,UDP支持一对一、一对多、多对一) (还有:TCP首部开销有20个字节;UDP分组首部开

    2024年02月11日
    浏览(30)
  • Java实训第八天——2023.6.14

    官方文档:https://v2.cn.vuejs.org/v2/guide/index.html 1.将vue.min.js复制到js中: 2.在demo01.html中,引入js 3.将官方文档复制到demo01.html中 demo01.html代码如下: 4.出现如下结果,则环境搭建成功! html代码如下: 运行结果: html代码如下: 运行结果如下: 运行结果: 代码如下: 初始页面:

    2024年02月09日
    浏览(34)
  • 自学大数据第八天~HDFS命令(二)

    嗨喽,好久不见,最近抽空复习了一下hadoop,书读百遍,其意自现这句话还真是; 改变文件 拥有者~chown 使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是超级用户。 改变文件所属组-chgrp 改变文件权限-chmod 使用-R将使改变在目录结构下递归进行。命令的使用者必须是文

    2023年04月09日
    浏览(24)
  • Java重修第八天—枚举和泛型

    通过学习本篇文章可以掌握如下知识 1、枚举 2、泛型 枚举是一种 特殊类 枚举类的格式: 为什么说枚举是一个特殊类,定义一个简单的枚举如下: 将其编译成class文件后,使用IDEA打开, 结果如下 :可以看出枚举类A有私有构造器。 枚举类的第一行只能罗列一些名称, 这些

    2024年01月17日
    浏览(28)
  • 百日刷题计划 ———— DAY1

    给出平面坐标上不在一条直线上三个点坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) ( x 1 ​ , y 1 ​ ) , ( x 2 ​ , y 2 ​ ) , ( x 3 ​ , y 3 ​ ) ,坐标值是实数,且绝对值不超过 100.00,求围成的三角形周长。保留两位小数。 对于平面上的两个点 ( x 1 , y 1 ) , ( x 2

    2024年02月15日
    浏览(28)
  • 15天学习MySQL计划-SQL优化/视图(进阶篇)-第八天

    1.插入数据(insert) 1.批量插入 2.手动提交事务 3.主键顺序插入 4.大批量插入数据 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令来进插入 方法如下。 2.主键优化 1.数据组织方式 2.页分裂 页可以为空,也可以填充一半,

    2023年04月26日
    浏览(44)
  • 0基础小白学习云计算的第八天(作者不易,你的关注就是我最大的动力)

    1、首先输入:vim /etc/my.cnfi进入配置文件 2、第二步:在最下面加入:skip-grant-tables 3、第三步:#validate-password=off(之前学过的修改密码配置把他注释掉) ​ 操作如下图所示 4、重启数据库:systemctl restart mysqld ​ 操作如下图所示 5、描述mysql用户:desc mysql.user; ​ 操作如下图所示

    2024年01月15日
    浏览(31)
  • 【C++刷题】经典简单题第二辑

    回文排列 URL化 配对交换 递归乘法 阶乘尾数 二进制链表转整数 从链表中删去总和值为零的连续节点 括号的最大嵌套深度 整理字符串 奇偶树 将句子排序 最长和谐子序列

    2024年02月09日
    浏览(29)
  • 蓝桥杯刷题第二十五天

    题目描述 你有一张某海域 NxN 像素的照片,\\\".\\\"表示海洋、\\\"#\\\"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中\\\"上下左右\\\"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛

    2023年04月09日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包