文章目录
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;
}