实验7-2-5 判断上三角矩阵 (15分)
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
输出样例:
YES
NO
题解
#include<stdio.h>
#include<string.h>
int a[105][105];
int n;
int check()
{
for(int i = 1; i <= n; i++)
for(int j = 1; j < i;j ++)
if(a[i][j] != 0) return 0;
return 1;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
if(check()!=0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
#include<stdio.h>
int a[15][15];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n ;i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
int flag = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < i; j++)
{
if(a[i][j] != 0)
{
flag = 0;
break;
}
}
if(flag == 0) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
实验7-2-7 方阵循环右移 (20分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
题解
#include<stdio.h>
#include<string.h>
int a[105][105], res[105][105];
int n, m;
int main()
{
scanf("%d %d", &m, &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
res[i][(j + m) % n] = a[i][j];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%d ", res[i][j]);
printf("\n");
}
return 0;
}
实验7-3-4 字符串替换 (15分)
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 | 对应字母 |
---|---|
A | Z |
B | Y |
C | X |
D | W |
… | … |
X | C |
Y | B |
Z | A |
输入格式:
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
题解
#include<stdio.h>
#include<string.h>
char s[105];
int main()
{
gets(s);
int len = strlen(s);
for(int i = 0; i < len; i++)
{
if(s[i] <= 'Z' && s[i] >= 'A')
{
s[i] = 'Z' - (s[i] - 'A');
}
}
printf("%s\n",s);
return 0;
}
#include<stdio.h>
#include<string.h>
char s[100];
int main()
{
gets(s);
for(int i = 0; i < strlen(s); i++)
{
if(s[i] >= 'A' && s[i] <= 'Z')
{
s[i] ='A' + (25 - (s[i] - 'A'));
}
}
printf("%s\n",s);
return 0;
}
蛇形矩阵
输入n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。
输入
6 6输出
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
#include<stdio.h>
int dx[] = {0, 1, 0, -1},dy[] = {1, 0, -1, 0};
int res[105][105];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int x = 0, y = 0, d = 0;// (x,y)表示当前坐标
for(int i = 1; i <= n * m; i++)
{
res[x][y] = i;
int a = x + dx[d], b = y + dy[d];// (a,b)表示下一步坐标
if(a >= n || a < 0 || b >= m || b < 0 || res[a][b])// 不合法
{
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
for(int i = 0; i < n; i ++ )
{
for(int j = 0; j < m; j ++ )
printf("%d ", res[i][j]);
printf("\n");
}
return 0;
}
PAT初探
比赛形式:3小时,闭卷
1001 A+B Format
计算 a+b
输出格式:需要最低位开始每隔三个位加进一个逗号,注意少于四位则不需添加。
输入
-1000000 9
输出
-999,991
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
int c = a + b;
string num = to_string(c);
string res;
for(int i = num.size() - 1, j = 0; i >= 0; i--)
{
res = num[i] + res;
j++;
if(j % 3 == 0 && i != 0 && num[i - 1] != '-')
res =',' + res;
}
cout << res << endl;
return 0;
}
1002 A+B for Polynomials
给定两个多项式 A和 B,计算 A+B 的结果。
输入
K
N
1
a
N
1
N
2
a
N
2
…
N
K
a
N
K
K \quad N_{1} a_{N_{1}} \quad N_{2} a_{N_{2}} \quad \ldots \quad N_{K} a_{N_{K}}
KN1aN1N2aN2…NKaNK
K 表示多项式中非零项的数量,
N
i
N_i
Ni 和
a
N
i
a_{Ni}
aNi 分别表示其中一个非零项的指数和系数。
#include <iostream>
using namespace std;
const int N = 1010;
int k;
double a[N], b[N], c[N];
int main()
{
cin >> k;
while (k -- )
{
int n;
double v;
cin >> n >> v;
a[n] = v;
}
cin >> k;
while (k -- )
{
int n;
double v;
cin >> n >> v;
b[n] = v;
}
for (int i = 0; i < N; i ++ )
c[i] = a[i] + b[i];
k = 0;
for (int i = 0; i < N; i ++ )
if (c[i])
k ++ ;
cout << k;
for (int i = N - 1; i >= 0; i -- )
if (c[i])
printf(" %d %.1f", i, c[i]);
return 0;
}
算法
二分
思想
本质:二段性:左半区间满足性质,右半区间不满足性质
答案1:
mid = (l + r + 1) / 2;//l = r - 1
if(check(mid))
{
l = mid;//[mid, r]
}
else
r = mid - 1;//[l, mid - 1]
答案2:
mid = (l + r) / 2;
if(check(mid))
{
r = mid ; //[l, mid]
}
else
l = mid + 1; //[mid + 1, r]
例题
输入一个升序的长度为n的整数数组,询问每一次数的范围。
输入
5 2
1 2 2 2 6
2
6
输出
1 3
4 4
#include <iostream>
using namespace std;
const int N = 100010;
int n, m, a[N];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
while (m -- )
{
int x;
scanf("%d", &x);
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r >> 1;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
if (a[l] != x) cout << "-1 -1" << endl;
else
{
cout << l << ' ';
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (a[mid] <= x) l = mid;
else r = mid - 1;
}
cout << l << endl;
}
}
return 0;
}