C语言经典习题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
冒泡排序
有下面一列数据: 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);
以上是关于C语言经典习题的主要内容,如果未能解决你的问题,请参考以下文章