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

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

作者:Mylvzi 

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

目录

1.有序序列判断

题目描述:

 分析过程:

代码实现:

2.获得月份天数

题目描述:

分析过程:

 代码实现:

3.矩阵相等判定

题目描述:

分析过程:

4.矩阵交换

题目描述:

代码实现:

5.井字棋判断输赢

题目描述:

代码实现:

6.递归进行进制转换

题目描述:

分析过程:

 代码实现:

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


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

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

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值