C语言刷题第一天(4题)

简介: C语言刷题第一天(4题)

C语言的结束只是我们代码人的开始

一、今天是第一天的刷题(加油代码人)

总共有4个题目

1.第一个题目我们讲一讲有关汉偌塔问题的算法

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
//不使用递归实现
void Hanio_Step(int num, char A, char B, char C)
{
  if (num == 1)
  {
    printf("%c->%c\n",A,C);//奇数走A->C 偶数走A->B
  }
  else//这个就是除了只有1层剩下的两种情况 1.就是此时的n-1个碟子从A经过C到B 2.就是此时的n-1个碟子从B经过A到C 所以就是按照这个情况一直运行下去
  {
    Hanio_Step(num - 1, A, C, B);//这步的意思就是从A经过C到B
    printf("%c->%c\n",A,C);
    Hanio_Step(num - 1, B, A, C);//这步的意思就是从B经过A到C
  }
}
int main()
{
  int num;
  scanf("%d",&num);
  printf("完成%d层的汉偌塔需要%d步\n",num,(int)pow(2,num)-1);
  //这边重新包装一个函数来实现汉偌塔的移动的步骤的打印
  Hanio_Step(num, 'A', 'B', 'C');
  return 0;
}

(1.)汉偌塔问题属实是值得花时间好好搞一下的

(2.)这边通过给你们举一个完成2层汉偌塔的移动的过程,剩下了都是一个道理

(3.)如图

66.png


2.第二个题目是关于杨辉三角的一点小算法

#include<stdio.h>
void yhtri(int line)
{
  int i, j;
  int arr[20][20] = { 0 };//首先创建一个二维数组
  for (i = 0; i <= line-1; i++)
  {
    if (i == 0)
      arr[0][0] = 1;
    else if (i == 1)
    {
      arr[1][0];
      arr[1][1];
    }
    else
    {
      for (j = 1; j < i; j++)
      {
        arr[i][0]=1;
        arr[i][i]=1;
        arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//实现三角形中各个数字的相加
      }
    }
  }
  for (i = 0; i < line; i++)
  {
    for (j = line; j > i + 1; j--)//这步可以重点理解一下
    {
      printf("   ");
    }
    for (j = 0; j <= i; j++)
    {
      printf("%-6d",arr[i][j]);
    }
    printf("\n");
  }
}
int  main()
{
  int line;
  printf("请输入杨辉三角的行数:");
  scanf("%d",&line);
  yhtri(line);
  return 0;
}

67.png


(1.)具体的原理就是运用到了杨辉三角的几个特点


1.每行的端点和结尾处的数都为1

2.每行数字左右对称,由1开始逐渐变大

3.第n行就有n项

4.每个数字等于上一行的左右两个数字之和(假如此时的这个数的坐标是 arr[ i ][ j ],则这个数的值就是等于arr[ i-1 ] [ j ]和arr[ i-1 ] [ j-1 ] 这两个左边的数字的和),用中文来说就是,这个数等于上一行本列和上一行上一列的数字的和


(2.)所以此时利用杨辉三角的这几个特点就可以很好的将其用C语言的方式给编译出来了


3.第三个题目就是关于质数的题目

题目具体如下:


小A有一个质数口袋,里面可以装各个质数。他从2开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L 的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

(1.)这个题目主要就是考我们的阅读理解能力和基础知识的运用,所以你可以自己去尝试着写一下

可以先不看,看看自己能写多少,如果有个别不懂的地方可以进行参考:

(2.)具体代码如下:


#include<stdio.h>
int main()
{
  int i = 0;
  int sum = 0;
  int count = 0;
  int arr[1024] = { 0 };
  int L = 0;
  scanf("%d", &L); 
  for (i = 2; ; i++)
  {
    int j = 0;
    for (j = 2; j < i; j++)
    {
      if (i % j == 0)
      {
        break;
      }
    }
    if (i == j)
    {
      printf("%d\n", i);
      printf("\n");
      sum += i;
      arr[count] = i;
      count++;
    }
    if (sum >= L)
    {
      count = count - 1;
      sum -= arr[count];
      break;
    }
  }
  printf("%d\n",count);
  printf("\n");
  printf("%d\n",sum);
  return 0;
}

打印结果如下:

68.png


(3.)超详注释如下(6个变量定义法则)帮你快速拥有解题技巧,一个变量一个两边的定义

图片截成两张,以防太小:

69.png


(4.)以上就是这个有关质数的题目的注释

4.第四个题目就是关于数组排序的题目

70.png

(1.)代码如下:

#include<stdio.h>
int main()
{
  int i, j,n,tmp;
  int arr[1024] = { 0 };
  scanf("%d",&n);
  for (i = 0; i < n ; i++)
  {
    scanf("%d",&arr[i]);
  }
  for (i = 0; i < n - 1; i++)
  {
    for (j = 0; j < n - i - 1; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
  for (i = 0; i < n; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

(2.)大致就是冒泡排序的思想,但是要注意的一点就是在我输入5个数的时候,可以使用循环输入的方法,然后放进数组中的方法


5.总结:做题贵在坚持,你的耐心和你的时间就是你的智慧,所以不要认为自己学不会(但是更不能觉得自己有多厉害,我们只是代码人……),算法贵在坚持,加油!这就是我第一天做的题,明天我们继续做别的题。


相关文章
|
5月前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
3月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
5月前
|
C语言
【C语言刷题系列】删除公共元素
【C语言刷题系列】删除公共元素
|
5月前
|
存储 C语言
【C语言刷题系列】对数字添加逗号
【C语言刷题系列】对数字添加逗号
|
5月前
|
C语言
【C语言刷题系列】喝汽水问题
【C语言刷题系列】喝汽水问题
|
30天前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
12 0
|
3月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
3月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
3月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
5月前
|
C语言
C语言刷题(函数)
C语言刷题(函数)