首页 > 其他分享 >C语言经典习题(二)

C语言经典习题(二)

时间:2023-02-19 19:33:14浏览次数:42  
标签:sz arr int C语言 ++ 数组 经典 杨辉三角 习题

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

重新排列数组

在这里插入图片描述

/**
 * 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操作。

冒泡排序

有下面一列数据: {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]);
	}
}

将数字变成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;
	}
}

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

四叶玫瑰数

在这里插入图片描述 在这里插入图片描述 分析:使用循环,获取每个位上的数,最后再使用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函数的使用方法:

在这里插入图片描述

标签:sz,arr,int,C语言,++,数组,经典,杨辉三角,习题
From: https://blog.51cto.com/zxhy/6066805

相关文章

  • C语言进阶--内存中的浮点数
    浮点数的转换--将浮点数转换成二进制--用科学计数法表示二进制浮点数--计算指数偏移后的值注意:计算指数时需要加上偏移量,而偏移量的值与类型有......
  • C语言进阶--有符号与无符号
    数据类型的最高位用于标识数据的符号-最高位为1,表明这个数为负数-最高位为0,表明这个数为正数*在计算机内部用补码表示有符号数-正数的补码就是正数本身-负数......
  • 宏展开--C语言
    定义一个宏,参考下面例子及运行输出结果。这里宏展开为简单替换,展开为3+1*3+4;所以一般带参数的宏定义的时候需要使用()保证运行正确。  #include<stdio.h>#defineS(a......
  • c语言中printf不输出任何东西?,缓冲区未满不输出任何东西
    下面代码为什么没有任何输出:#include<cstdio>#include<unistd.h>intmain(intargc,char**argv){while(1){sleep(1);pri......
  • 社招前端经典vue面试题(附答案)
    Vuex页面刷新数据丢失怎么解决体验可以从localStorage中获取作为状态初始值:conststore=createStore({state(){return{count:localStorage.getIt......
  • 阿里前端经典react面试题集锦
    hooks为什么不能放在条件判断里以setState为例,在react内部,每个组件(Fiber)的hooks都是以链表的形式存在memoizeState属性中update阶段,每次调用setState,链表......
  • 腾讯前端经典react面试题(附答案)
    React性能优化在哪个生命周期?它优化的原理是什么?react的父级组件的render函数重新渲染会引起子组件的render方法的重新渲染。但是,有的时候子组件的接受父组件的数据没有......
  • C语言:100-200间所有 质数及和,按格式输出,最后没有逗号
      #include<stdio.h>main(){inta,b,c,d=0,sum=0;printf("100-200间所有质数:");for(a=100;a<=200;a++){c=0;for(b=2;b<a......
  • C语言填空:圆环面积
    //程序功能:已知有一圆环,内圆半径r1,外圆半径r2,求圆环面积(保留2位小数)【1】【2】PI3.1415926main(){【3】r1,r2,area;printf("请输入内圆半径r1,外圆半......
  • C语言:四组字符排序
    #include<stdio.h>/*程序功能:从键盘输入4组字符,每组字符数量为3个,字符之间用空格隔开;编程将每组字符按ASCII码由小到大的顺序输出。例如:请输入第1组字符:qaz第1组......