【C语言】编程初学者入门训练(11)

101. 矩阵相等判定

  • 问题描述:KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他。(当两个矩阵对应数组元素都相等时两个矩阵相等)。

  • 输入描述

    • 第一行包含两个整数n和m,表示两个矩阵包含n行m列,用空格分隔。
    • 从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
    • 从n+2行到2n+1,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第二个矩阵中的元素。
    • 1 < n,m < 10
  • 输出描述:一行,如果两个矩阵相等输出"Yes"并换行,否则输出"No"并换行。

  • 示例

输入:
		2 2
		1 2
		3 4
		1 2
		3 4
输出:
		Yes
  • 代码实现
#include <stdio.h>
int main()
{
        int n,m,i,j;
        int arr1[10][10]= {0};
        int arr2[10][10]= {0};
        scanf("%d %d",&n,&m);
 
        //录入第一个矩阵
        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]);
                }
        }
        //比较两个数组对应位置的元素
        for(i = 0;i < n;i++)
        {
                for(j = 0;j < m;j++)
                {
                        if(arr1[i][j] != arr2[i][j])
                        {
                                printf("No\n");
                                return 0;
                        }
                }
        }
        printf("Yes\n");
        return 0;
}

102. 上三角矩阵判定

  • 问题描述:KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。

  • 输入描述:第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (1≤n≤10)从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。

  • 输出描述:一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。

  • 示例

输入:
		3
		1 2 3
		0 4 5
		0 0 6
输出:
		YES
  • 解题思路:对角线以下的元素都是 0 的,则为上三角矩阵。
    • 所有为 0 元素的坐标的特点是:i > j,也就是说只要判断当 i > j 时的所有元素是否为 0 即可。

在这里插入图片描述

  • 代码实现
#include <stdio.h>
int main()
{
	int n,i,j;
	int arr[10][10];
	scanf("%d",&n);

	for(i = 0;i < n;i++)
	{
		for(j = 0;j < n;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	
	for(i = 0;i < n;i++)
	{
		for(j = 0;j < n;j++)
		{
			if(i > j)
			{
				if(0 != arr[i][j])
				{
					printf("NO\n");
					return 0;
				}
			}
		}
	}
	printf("YES\n");
	return 0;
}

103. 矩阵转置

  • 问题描述:KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。

  • 输入描述:第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10),从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。

  • 输出描述:输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。

  • 示例

输入:
		2 3
		1 2 3
		4 5 6
输出:
		1 4 
		2 5 
		3 6 
  • 解题思路:原来的列变成行,行则变成列。

  • 代码实现

#include <stdio.h>
int main()
{
        int n,m,i,j;
        int arr[10][10];
        scanf("%d %d",&n,&m);

        for(i = 0;i < n;i++)
        {
                for(j = 0;j < m;j++)
                {
                        scanf("%d",&arr[i][j]);
                }
        }
        for(i = 0;i < m;i++)
        {
                for(j = 0;j < n;j++)
                {
                        printf("%d ",arr[j][i]);
                        //行变成了用j控制,列则由i控制
                }
                putchar('\n');
        }      
        return 0;
}

104. 矩阵交换

  • 问题描述:KiKi有一个矩阵,他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。
  • 输入描述
    • 第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
    • 从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
    • 接下来一行输入k,表示要执行k次操作(1≤k≤5)。接下来有k行,每行包括一个字符t和两个数a和b,中间用空格格分隔,t代表需要执行的操作,当t为字符’r’时代表进行行变换,当t为字符’c’时代表进行列变换,a和b为需要互换的行或列(1≤a≤b≤n≤10,1≤a≤b≤m≤10)。
    • 提示:当t为别的字符时不需要处理
  • 输出描述:输出n行m列,为矩阵交换后的结果。每个数后面有一个空格。
  • 示例1
    输入:
	2 2
		1 2
		3 4
		1
		r 1 2
输出:
		3 4 
		1 2 
  • 示例2
输入:
		2 2
		1 3
		6 8
		2
		c 1 2
		t 1 2
  • 代码实现
#include <stdio.h>
int main()
{
	int n,m,i,j;
	int arr[10][10];
	scanf("%d %d",&n,&m);
	
	for(i = 0;i < n;i++)
	{
		for(j = 0;j < m;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}	

	int k;//操作k次	
	scanf("%d",&k);//k\n,输入k次之后敲回车还剩个\n

	char t;
	int  a,b;
	for(i = 0;i < k;i++)//每一次操作的过程
	{
		scanf(" %c %d %d",&t,&a,&b);
		//%c前多个空格能消化掉上面剩下的\n
		//不让t接收到的值变成\n

		if(t == 'r')//交换a和b行
		{
			for(j = 0;j < m;j++)
			{
				int tmp = arr[a-1][j];
				arr[a-1][j]= arr[b-1][j];
				arr[b-1][j]= tmp;
			}
		}
		else if(t == 'c')//交换a和b列
		{
			for(j = 0;j < n;j++)
			{
				int tmp = arr[j][a-1];
				arr[j][a-1]= arr[j][b-1];
				arr[j][b-1]= tmp;
			}
		}		
	}
	
	//交换完之后打印
	for(i = 0;i < n;i++)
	{
		for(j = 0;j < m;j++)
		{
			printf("%d ",arr[i][j]);
		}
		putchar('\n');
	}
	
	return 0;
}

105. 杨辉三角

  • 问题描述:KiKi知道什么叫杨辉三角之后对杨辉三角产生了浓厚的兴趣,他想知道杨辉三角的前n行,请编程帮他解答。杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。

  • 输入描述:第一行包含一个整数数n。 (1≤n≤30)

  • 输出描述:包含n行,为杨辉三角的前n行,每个数输出域宽为5。

  • 示例

输入:6
输出:
    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
    1    5   10   10    5    1
  • 解题思路
    • 前提:每行端点与结尾的数为1。
    • 每个数为上方的两数之和,且头两行无需计算全都是1。
    • 行列相等的位置的值为1。
    • 在框起来的三角形内行都是>=2的,列都是>=1的。当行列都在范围内的时候才需要去计算。

在这里插入图片描述

  • 代码实现
#include <stdio.h>
int main()
{
	int n,i,j;
	int arr[30][30];
	scanf("%d",&n);
	
	for(i = 0;i < n;i++)
	{
		for(j = 0;j < n;j++)
		{
			if(0 == j)//将第0列的值置为1
			{
				arr[i][j] = 1;
			}
			if(i == j)//将对角线的值置为1
			{
				arr[i][j] = 1;
			}
			if(i >= 2 && j >= 1)
			{
				arr[i][j] = arr[i-1][j-1]+ arr[i-1][j];
			}
		}
	}
	for(i = 0;i < n;i++)
	{
		//要打印三角形,i打印多少j就打印多少
		for(j = 0;j <= i;j++)
		{
			printf("%5d",arr[i][j]);
		}
		putchar('\n');
	}
	return 0;
}

106. 井字棋

  • 问题描述:KiKi 和 BoBo 玩 “井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。
  • 输入描述:三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表示没有棋子,为B代表BoBo玩家的棋子。
  • 输出描述
    • 如果KiKi获胜,输出“KiKi wins!”;
    • 如果BoBo获胜,输出“BoBo wins!”;
    • 如果没有获胜,输出“No winner!”。
  • 示例
输入:
		K O B
		O K B
		B O K
输出:KiKi wins!
  • 解题思路:判断横3、竖3、对角线上的元素是否相等即可。
  • 代码实现
#include <stdio.h>
int main()
{
	int i,j;
	char arr[3][3];
	
	for(i = 0;i < 3;i++)
	{
		for(j = 0;j < 3;j++)
		{
			scanf(" %c",&arr[i][j]);
			//记得消化掉按下回车之后剩余的\n
		}
	}

	//判断输赢
	char flag = 'O';
	for(i = 0;i < 3;i++)
	{
		//判断某一行的三个是否相等且不为'O'
		if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][1]!='O')
		{
			flag = arr[i][1];
			break;
		}
		//判断某一列的三个是否相等且不为'O'
		if(arr[0][i]==arr[1][i]&&arr[1][i]==arr[2][i]&&arr[1][i]!='O')
                {
                        flag = arr[1][i];
                        break;
                }

	}
	//判断对角线上的三个是否相等
	if(arr[0][0]== arr[1][1]&&arr[1][1]==arr[2][2]&&arr[1][1]!='O')
	{
		flag = arr[1][1];
	}
	//判断另一条对角线
	if(arr[0][2]== arr[1][1]&&arr[1][1]==arr[2][0]&&arr[1][1]!='O')
        {
                flag = arr[1][1];
        }

	if('K' == flag)			printf("KiKi wins!\n");
	
	else if('B' == flag)	printf("BoBo wins!\n");
	
	else					printf("No winner!\n");

	return 0;
}

107. 小乐乐与进制转换

  • 问题描述:小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。

  • 输入描述:输入一个正整数n (1 ≤ n ≤ 109)

  • 输出描述:输出一行,为正整数n表示为六进制的结果

  • 示例1

    • 输入:6
    • 输出:10
  • 示例2

    • 输入:120
    • 输出:320
  • 解题思路

    • 先让输入的数 n % 6 得到当前数转换成六进制的最低位;
    • 然后让 n / 6,用得到的结果继续 % 6 获得第二低位;
    • 不停重复上述步骤,直到 n / 6 的结果为 0 为止。
    • 最后将得出的结果翻转过来,就是十进制转六进制的最终结果。

在这里插入图片描述

  • 代码实现
#include <stdio.h>
int main()
{
        int n,i = 0;
        int arr[40];//将%6,/6后得到的结果存起来
        scanf("%d",&n);

        //转换
        while(n)//如果n不为0,说明还有能拿下来的位
        {
                arr[i] = n % 6;
                i++ ;
                n = n / 6;//去掉最低位
        }
        for(i--;i >= 0;i--)
        {
                printf("%d",arr[i]);
                //将得到的数翻转过来就是6进制
        }
        return 0;
}

108. 小乐乐求和

  • 问题描述:小乐乐最近接触了求和符号Σ,他想计算在这里插入图片描述
    的结果。但是小乐乐很笨,请你帮助他解答。

  • 输入描述:输入一个正整数n (1 ≤ n ≤ 109)

  • 输出描述:输出一个值,为求和结果。

  • 示例1

    • 输入:1
    • 输出:1
  • 示例2

    • 输入:10
    • 输出:55
  • 代码实现1

#include <stdio.h>
int main()
{
        long long n,sum = 0;
        scanf("%lld",&n);

        for(int i = 1;i <= n;i++)
        {
                sum += i;
        }
        printf("%lld\n",sum);

        return 0;
}
  • 代码实现2
    • 等差数列公式:(1 + n) * n / 2
#include <stdio.h>
int main()
{
    	long long n;    
    	scanf("%lld",&n);

    	printf("%lld\n",(1+n)*n/2);

    	return 0;
}

109. 小乐乐定闹钟

  • 问题描述:小乐乐比较懒惰,他现在想睡觉,然后再去学习。他知道现在的时刻,以及自己要睡的时长,想设定一个闹钟叫他起床学习,但是他太笨了,不知道应该把闹钟设定在哪个时刻,请你帮助他。(只考虑时和分,不考虑日期)

  • 输入描述:输入现在的时刻以及要睡的时长k(单位:minute),中间用空格分开。

  • 输入格式:hour:minute k(如hour或minute的值为1,输入为1,而不是01),(0 ≤ hour ≤ 23,0 ≤ minute ≤ 59,1 ≤ k ≤ 109)。

  • 输出描述:对于每组输入,输出闹钟应该设定的时刻,输出格式为标准时刻表示法(即时和分都是由两位表示,位数不够用前导0补齐)。

  • 示例1

    • 输入:0:0 100
    • 输出:01:40
  • 示例2

    • 输入:1:0 200
    • 输出:04:20
  • 解题思路:用 k / 60 得到的结果就是对应的小时数,用 k % 60 得到的结果则是对应的分钟数。

  • 代码实现

#include <stdio.h>
int main()
{
        int h,m,k;
        scanf("%d:%d %d",&h,&m,&k);

        h = (h + (m + k) / 60) % 24;//转小时转成24进制
        m = (m + k) % 60;//将分钟转成60进制

        printf("%02d:%02d\n",h,m);

        return 0;
}

110. 小乐乐排电梯

  • 问题描述:小乐乐学校教学楼的电梯前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。请帮助小乐乐计算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层)

  • 输入描述:输入包含一个整数n (0 ≤ n ≤ 109)

  • 输出描述:输出一个整数,即小乐乐到达楼上需要的时间。

  • 示例1

    • 输入:1
    • 输出:2
  • 示例2

    • 输入:12
    • 输出:6
  • 代码实现;

#include <stdio.h>
int main()
{
        int n;
        scanf("%d",&n);

        printf("%d\n",(n / 12)*4 + 2);

        //n / 12得出需要上下几趟电梯,
        //然后* 4得出轮到乐乐上电梯时的时间,
        //再加上小乐乐上去的两分钟

        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值