【1】矩阵的转置
#include <stdio.h>
int main() {
int m, n, i, j, flag;
while (scanf("%d%d", &n, &m) != EOF) {
int a[2000];
for (i = 0; i < m * n; i++) {
scanf("%d", &a[i]);
}
for (i = 0; i < m; i++) {
for (j = i; j <= i + m * (n - 1); j = j + m) {
printf("%d ", a[j]);
}
printf("\n");
}
}
return 0;
}
【2】输出n*m的矩阵,要求左上角元素是1,然后从左到右 从上到下依次增大
注意m与n不要搞混
#include <stdio.h>
int main() {
int m, n, i, j, flag;
while (scanf("%d%d", &n, &m) != EOF) {
for (i = 1; i <= 1 + m * (n - 1); i = i + m) {
for (j = i; j < i + m; j++) {
printf("%d ", j);
}
printf("\n");
}
}
return 0;
}
【3】输出n*m的弓型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右)
输入
4 3
输出
1 2 3 6 5 4 7 8 9 12 11 10
左对齐与右对齐:只需在%d中间加上位数,比如%2d,多出的部分不会被截断。
#include <stdio.h>
int main() {
int m, n, i, j, flag;
while (scanf("%d%d", &n, &m) != EOF) {
for (i = 1; i <= 1 + m * (n - 1); i = i + m) {
if ((i - 1) / m % 2 == 0) {
for (j = i; j < i + m; j++) {
printf("%2d ", j);
}
} else {
for (j = i + m - 1; j >= i; j--) {
printf("%2d ", j);
}
}
printf("\n");
}
}
return 0;
}
【4】输入一个m×n的矩阵,计算每行的和。将行号最高的行与矩阵的第一行进行位置交换,输出调整后的矩阵以及每行的和。
土办法不行了,学习了一下二维数组。
#include <stdio.h>
int main() {
int n, m, a[10][10], i, j, sum[10], k;
while (scanf("%d%d", &m, &n) != EOF) {
for (i = 0; i < m; i++) {
sum[i] = 0;
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
sum[i] += a[i][j];
}
}
for (i = 0; i < m; i++) {
if (i == 0) {
k = m - 1;
} else if (i == m - 1) {
k = 0;
} else {
k = i;
}
printf("%d", a[k][0]);
for (j = 1; j < n; j++) {
printf(" %d", a[k][j]);
}
printf(" %d\n", sum[k]);
}
}
return 0;
}
【5】输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<=30),表示将要输出的杨辉三角的层数。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。
1.先给数组初始化成0:不太懂为什么oj平台上对 int a[n][n] = {0};报编译错误。只能先改成for语句一个一个赋值。
2.将第一列和行标列标相等的数组赋值成1。剩下的加法运算。
#include <stdio.h>
int main() {
int n, i, j;
while (scanf("%d", &n) != EOF) {
int a[n][n];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
a[i][j] = 0;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
if (j == 0 || i == j) {
a[i][j] = 1;
} else {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
【6】输入一个正整数n(1<= n <= 6)和n阶方阵a中的每一个元素,如果找到a的鞍点(鞍点的元素值在该行上最大,在该列上最小),就输出它的下标,否则输出“NO”(设a最多只有一个鞍点)。
#include <stdio.h>
int main() {
int n, i, j, max, x, y, flag, k;
while (scanf("%d", &n) != EOF) {
int a[n][n];
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < n ; i++) {
max = a[i][0];
flag = 1;
for (j = 1; j < n; j++) {
if (a[i][j] > max) {
max = a[i][j];
x = i;
y = j;
}
}
for (k = 0; k < n && flag == 1; k++) {
if (a[k][y] < max) {
flag = 0;
}
}
if (flag == 1) {
printf("%d %d\n", x, y);
break;
}
}
if (flag == 0) {
printf("NO\n");
}
}
return 0;
}
代码运行错误。