前言

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

刷题第八天目录

  • 前言
    • 71.打印7层杨辉三角形
    • 72.重新排列数组
    • 73.冒泡排序
    • 74.将数字变成0的操作次数
    • 75.四叶玫瑰数

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

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

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

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

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

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

执行完上面的赋值代码后,我们数组中的数,就会变成如下这个样子:

这样,杨辉三角的赋值过程就已经结束了,接下来就是打印过程了,二维数组的打印依旧二重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.重新排列数组

/*** 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的操作次数

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.四叶玫瑰数



分析:使用循环,获取每个位上的数,最后再使用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语言百日刷题第八天相关推荐

  1. C语言百日刷题第七天

    C语言百日刷题第七天 61. 写一个函数isPowerOfTwo判断是不是2的幂次方 62. 写一个函数isPowerOfThree判断是不是3的幂次方 63.n 的第 k 个因子 64.有效的完全平 ...

  2. C语言百日刷题第二天

    C语言百日刷题第二天 11. 统计输入数据的正负个数 12.学生基本信息输入输出 13.杨辉三角的前n行 14.模拟用户登录情景 15.演示多个字符从两端移动,向中间汇聚 16.计算短信费用 17.编 ...

  3. C语言百日刷题第十三天

    前言 今天是刷题第13天,放弃不难,但坚持一定很酷~ 临近期末,再刷一套模拟题 C语言百日刷题第十三天 前言 选择题 判断题 编程题 选择题 1.若由定义int*p1,*p2,m=5,n;以下赋值语句 ...

  4. C语言百日刷题第五天

    C语言百日刷题第五天 41.实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定 42.实现一个函数来交换两个整数的内容. 43.实现一个函数来进行整型有序数组的二分查找 44.接收一个无符号整型 ...

  5. C语言百日刷题第十天

    前言 今天是刷题第10天,放弃不难,但坚持一定很酷~ 快来跟我一起刷题吧. C语言百日刷题第十天 前言 81.连接两个字符串 82.输入一行字符,分别统计其中英文字母.空格.数字和其他字符的个数. 8 ...

  6. c语言百日刷题第四天

    目录 1.用筛选法求100之内的素数 2.用选择法对10个整数排序 3.求一个3*3的整型矩阵的对角线之和 4.有一个已排序好的数组,要求输入一个数后,按原来排序的规律将它插入数组中 5.将一个数组中 ...

  7. C语言百日千题系列之《忘情水题》第一日

    目录 绪论 1.最大数位置 2.与指定数字相同的数的个数 3.蓝桥杯2013年第四届真题-核桃的数量 4.求所给范围内水仙花数并排列 5.最大值和最小值的差 6.计算书费 7.角谷猜想 8. 最高的分 ...

  8. c语言getchar_二级C语言试题刷题录

    2020.9 计算机二级C语言科目 选择题 标黑的为正确选项 程序流程图中带有箭头的线段表示的是 ==控制流== 图元关系.数据流.调用关系 当图为数据流图的时候,标有名字的箭头表示数据流 结构化程序 ...

  9. C语言PAT刷题 - 1020 月饼

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

最新文章

  1. Bootstrap学习之二:栅格化布局
  2. [urllib]urlretrieve在python3
  3. oracle批量把小写转换成大写,oracle数据库批量将表名小写转大写
  4. 编程大白给编程小白的四点建议
  5. 如何应对Spark-Redis行海量数据插入、查询作业时碰到的问题
  6. 加密、数字签名和数字证书
  7. php相关知识,PHP的基础知识简单介绍
  8. python中ndarray除_Numpy 基本除法运算和模运算
  9. VS编程之查看数组信息
  10. 林记seo告诉你seo教程菜鸟seo一个月到底能赚多少钱
  11. android获取系统签名,Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名...
  12. 深入浅出TensorFlow2函数——tf.data.Dataset.padded_batch
  13. python--列表、数组扁平化
  14. 网络工程管理 第四章 路由器 RIP OSPF 及配置实验
  15. 高精度加法 problem A+B
  16. 有什么软件可以自动把PDF文件翻译成英文的吗?
  17. Windows系统日志文件分析
  18. 有关VC++6.0 C语言编译得到的.exe文件图标修改
  19. 2022一建四色笔记
  20. 2016初中计算机考试试题,2016年计算机二级考试MS Office习题及答案

热门文章

  1. Congested Crowd Instance Localization with Dilated Convolutional Swin Transformer
  2. HTML(3):IE浏览器编程
  3. 三十多岁的我,为了生活转行Java,开始我的小白之路!
  4. 基于Python+django的学生信息管理系统-计算机毕业设计
  5. 通过中央气象台做天气预报
  6. NBA历史上的4双和准4双记录!
  7. 云渲染哪个平台费用低?云渲染怎么收费
  8. 一个phper对mamp和mamp pro的初级体会(MAC系统下)
  9. 学习EasyExcel实现excel文件的批量上传的笔记
  10. 一个正经的前端学习 开源 仓库(阶段十三)