牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)

简介: 牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)

💕"痛苦难以避免,而磨难可以选择。"-->村上春树💕

作者:Mylvzi

文章主要内容:数据在内存中的存储

1.有序序列判断

题目描述:

分析过程:

代码实现:

#include <stdio.h>
int main() 
{
    //定义个数
    int n = 0;
    scanf("%d",&n);
    //循环输入数字
    int arr[n];
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d",&arr[i]);
    }
    //判断
    int flag1 = 0;//判断升序
    int flag2 = 0;//判断降序
    for(i=0; i<n-1; i++)
    {
        if(arr[i] <arr[i+1])
            flag1 = 1;
        else
            flag2 = 1;
    }
    //如果为unsorted flag1+flag2==2
    if(flag1 + flag2 == 2)
    {
        printf("unsorted");
    }
    else 
    {
    printf("sorted");
    }
    return 0;
}
/*第二种写法,边输入,边判断*/
#include <stdio.h>
//边输入,边判断
int main() 
{
    //定义个数
    int n = 0;
    scanf("%d",&n);
    //循环输入数字 //判断
    int flag1 = 0;//判断升序
    int flag2 = 0;//判断降序
    int arr[n];
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d",&arr[i]);
        if(i>=1)//只要输了一个元素之后,输入一个就和前面已经输入的数字进行比较
        {
            if(arr[i] <arr[i-1])
                flag1 = 1;
            else
                flag2 = 1;
        }
    }
    if(flag1 + flag2 == 2)
    {
        printf("unsorted");
    }
    else 
    {
    printf("sorted");
    }
    return 0;
}

2.获得月份天数

题目描述:

分析过程:

代码实现:

/*第一种写法,最直观的*/
#include <stdio.h>
int main()
{
  int y, m;
  while (scanf("%d %d", &y, &m) != EOF)
  {
    switch (m)
    {
    //第一种情况
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      printf("31\n");
            break;
    //第二种情况
    case 4:
    case 6:
    case 9:
    case 11:
      printf("30\n");
            break;
    //二月的情况  要判断是否是闰年
    default:
      if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
        printf("29\n");
      else
        printf("28\n");
    }
  }
  return 0;
}
/*第二种方法,漂亮的代码*/
#include <stdio.h>
//判断是否为闰年
int is_leap_year(int y)
{
  if((y%4==0 && y%100!=0 ) || (y%400==0))
    return 1;
  else
   return 0;
}
//获取天数
int get_days_of_month(int y,int m)
{
  //使用数组来存放对应的天数
  int d = 0;
  int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  d=day[m];
  if(m==2)
  {
    if(is_leap_year(y)==1)
      d+=1;
  }
  return d;
}
int main() 
{
  //输入年份和月数
  int y = 0;
  int m  = 0;
  while(scanf("%d %d",&y,&m)==2)
  {
    int d = get_days_of_month(y,m);
    printf("%d\n",d);
  }
  return 0;
}

3.矩阵相等判定

题目描述:

分析过程:

代码实现:(第二种方法要学习)

方法一:

#include <stdio.h>
//BC105
//方法一
//判断矩阵是否相等->大小相等,但对应元素未知
int main()
{
    //定义矩阵大小
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //两个矩阵的赋值
    int arr1[n][m];
    int arr2[n][m];
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr2[i][j]);
        }
    }
    //判断是否相等
    int flag = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            if (arr1[i][j] != arr2[i][j])
            {
                flag = 1;
            }
        }
    }
    if (1 == flag)
    {
        printf("No\n");
    }
    else {
        printf("Yes\n");
    }
    return 0;
}

方法2:(很不错的一个方法)(main函数也是函数,把它看作一个普通的自定义函数,只有一个返回值)

//BC105
//判断矩阵是否相等->大小相等,但对应元素未知
int main()
{
    //定义矩阵大小
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //两个矩阵的赋值
    int arr1[n][m];
    int arr2[n][m];
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr1[i][j]);
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr2[i][j]);
            if (arr2[i][j] != arr1[i][j])
            {
                printf("No\n");
                return 0;
            }
        }
    }
    printf("Yes\n");
    return 0;
}
//BC106上三角形矩阵判定
int main() 
{
    //定义方阵大小
    int n = 0;
    scanf("%d",&n);
    //方阵赋值并判断
    int arr[n][n];
    int i = 0;
    int j = 0;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&arr[i][j]);
            if(j<i)//下对角线的条件,j<i
            {
                if(arr[i][j] != 0)
                {
                    printf("NO\n");
                    return 0;
                }
            }
        }
    }
    printf("YES\n");
    return 0;
}

4.矩阵交换

题目描述:

代码实现:

 

#include <stdio.h>
//BC108  矩阵交换
int main()
{
    //定义矩阵大小
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //矩阵赋值
    int i = 0;
    int j = 0;
    int arr[n][m];
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    //输入进行变幻的次数
    int k = 0;
    scanf("%d", &k);
    //分三种情况进行操作
    int a = 0;//a仅仅是用来循环次数
    while (a < k)
    {
        //先定义要执行的操作
        char ope = 0;
        //定义具体位置
        int x = 0;
        int y = 0;
        while (getchar() != '\n');
        scanf("%c %d %d", &ope, &x, &y);
        switch (ope)
        {
        case 'r'://行操作
            for (j = 0; j < m; j++)
            {
                int temp = arr[x-1][j];
                arr[x-1][j] = arr[y-1][j];
                arr[y-1][j] = temp;
            }
            break;
        case 'c'://列操作
            for (i = 0; i < n; i++)
            {
                int temp = arr[i][x-1];
                arr[i][x-1] = arr[i][y-1];
                arr[i][y-1] = temp;
            }
            break;
        default://不进行操作
            break;
        }
        a++;
    }
    //输出变换后的矩阵
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

5.井字棋判断输赢

题目描述:

代码实现:

#include <stdio.h>
//BC110
//判断输赢函数
int is_winner(char arr[3][3], int row, int col)
{
    int x = 0;
    int y = 0;
    char flag = 0;
    //row
    for (x = 0; x < row; x++)
    {
        if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][0] == arr[x][2])
            flag = arr[x][0];
    }
    //col
    for (y = 0; y < col; y++)
    {
        if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[0][y] == arr[2][y])
            flag = arr[0][y];
    }
    //对角线
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] == arr[2][2])
    {
        flag = arr[0][0];
    }
    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] == arr[2][0])
    {
        flag = arr[0][2];
    }
    return flag;
}
int main()
{
    //用二维数组填充棋盘
    char arr[3][3];
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            scanf("%c", &arr[i][j]);
            getchar();//处理的是字符,注意要清理缓冲区
        }
    }
    //判断输赢
    char ret = is_winner(arr, 3, 3);
    if (ret == 'K')
    {
        printf("KiKi wins!");
    }
    else if (ret == 'B')
    {
        printf("BoBo wins!");
    }
    else 
    {
        printf("No winner!");
    }
    return 0;
}

总结:使用flag标记这种做法是一种很常见的C语言编程过程中使用到的技巧

6.递归进行进制转换

题目描述:

分析过程:

代码实现:

#include <stdio.h>
//BC111
//直接打印出来
void print(int num)
{
    if (num > 5)//保证num<6
    {
        print(num / 6);
    }
    printf("%d", num % 6);
}
int main()
{
    int num = 0;
    scanf("%d", &num);
    print(num);
    return 0;
}

画图理解递归过程:(推出去,再归回来)

目录
相关文章
|
1月前
【题型总结】动态规划之按照某种形式分割数组以获得最值
【题型总结】动态规划之按照某种形式分割数组以获得最值
50 0
|
8月前
【C刷题】矩阵相等判断与序列中删除指定的数字(下)
【C刷题】矩阵相等判断与序列中删除指定的数字(下)
|
3天前
【题解】NowCoder [编程题] 数组中两个字符串的最小距离
【题解】NowCoder [编程题] 数组中两个字符串的最小距离
17 7
|
1月前
|
算法 测试技术 C#
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
|
1月前
|
算法 测试技术 C++
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
【数论】【分类讨论】【C++算法】1611使整数变为 0 的最少操作次数
|
1月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
51 0
|
11月前
|
算法 Java
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
74 0