2022测试1¶
注意!此处的作答皆为我在考场上写的程序,并不一定是很好的,但是确实能通过测试的。
题目一 凯撒加密¶
Description¶
凯撒加密,是指对明文中的所有字母都在字母表上向后按照一个固定数目进行偏移后转换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,Z被替换成C,以此类推。字母加密之后大小写不变,比如a替换成d。
Input¶
第一行输入一个正整数,表示偏移量。 第二行输入一个正整数,表示字符串长度。 第二行输入一个字符串,表示待加密的字母。
Output¶
输出经过加密后的字符串
Sample Input 1¶
4 5 azGeX
Sample Output 1¶
edKiB
Mycode¶
#include <stdio.h>
int n,m,cnt=0;
char st[66],c;
int main(){
scanf("%d%d",&n,&m);n%=26;
getchar();
for(int i=1;i<=m;i++)scanf("%c",&st[i]);
for(int i=1;i<=m;i++){
if((st[i]>='A')&&(st[i]<='Z')){
if(st[i]+n>'Z')st[i]=('A'+n-('Z'-st[i])-1);
else st[i]+=n;
}
else if((st[i]>='a')&&(st[i]<='z')){
if((st[i]+n)>'z')st[i]=('a'+n-('z'-st[i])-1);
else st[i]+=n;
}
}
for(int i=1;i<=m;i++)printf("%c",st[i]);
return 0;
}
题目二 杨辉三角¶
Description¶
给定一个正整数n,生成杨辉三角的前n行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 提示:可以使用二维数组存储数字
Input¶
输入一个正整数n
Output¶
按照顺序输出杨辉三角的前n行,数字之间用空格隔开(输出最后一个数字之后不需要空格)
Sample Input 1¶
5
Sample Output 1¶
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
Mycode¶
#include <stdio.h>
int n;
long f[100][100];
int main(){
scanf("%d",&n);
f[1][1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++)f[i][j]=f[i-1][j-1]+f[i-1][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
printf("%ld",f[i][j]);
if(i==n&&j==n)break;
printf(" ");
}
}
return 0;
}
题目三 打印空心菱形图案¶
Description¶
输入一个正整数n(n为奇数),打印一个高度为n的“*”空心菱形图案。试编写相应程序。
Input¶
输入一个整数 n
Output¶
打印一个高度为n的空心棱形图案,行首非 “*” 号区域用空格字符填充,行末无空格填充,上下行之间无空行。
Sample Input 1¶
7
Sample Output 1¶
*
* *
* *
* *
* *
* *
*
Sample Input 2¶
51
Sample Output 2¶
*
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
*
Mycode¶
#include <stdio.h>
int n;
int main(){
scanf("%d",&n);
for(int i=1;i*2<=n;i++){
for(int j=1;j<=((n/2)-i+1);j++)printf(" ");
printf("*");
if(i==1){printf("\n");continue;}
for(int j=1;j<=2*i-3;j++)printf(" ");
printf("*\n");
}
printf("*");
for(int i=1;i<=n-2;i++)printf(" ");
printf("*\n");
for(int i=n/2;i>=1;i--){
for(int j=1;j<=((n/2)-i+1);j++)printf(" ");
printf("*");
if(i==1){continue;}
for(int j=1;j<=2*i-3;j++)printf(" ");
printf("*\n");
}
}
题目四 输出学生成绩¶
Description¶
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩、最低成绩和中位数成绩。 注: 本题中的中位数,是按顺序排列的一组数据中,位于中间位置的数; 若这组成绩共有偶数个,则中位数取排好序的成绩中间位置两个中,成绩数值较低的那一个,如 Sample1; 若为奇数个,则中位数取排好序的成绩中间那一个,如Sample2。
Input¶
输入第一行首先给出一个正整数 N,表示学生的个数。接下来一行给出 N 个正整数表示学生的成绩,数字间以空格分隔。
Output¶
按照以下格式输出: average = 平均成绩 max = 最高成绩 min = 最低成绩 mid = 中位数 平均成绩使用double型保留两位小数,其它为整型输出。
Sample Input 1¶
10 60 96 84 75 84 95 67 83 94 76
Sample Output 1¶
average = 81.40
max = 96
min = 60
mid = 83
Sample Input 2¶
7 70 70 77 73 87 81 96
Sample Output 2¶
average = 79.14
max = 96
min = 70
mid = 77
Mycode¶
#include <stdio.h>
int n;
int a[1000],b[10000],c[10000];
int maxx=0,minn=99999;
int mid;
double ave=0.0f;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=n;i++){
if(b[i]>maxx)maxx=b[i];
if(b[i]<minn)minn=b[i];
a[b[i]]++;
ave+=b[i];
}
ave/=n;
int cnt=1;
for(int i=minn;i<=maxx;i++){
for(int j=1;j<=a[i];j++)c[cnt++]=i;
}
if(n%2)mid=c[n/2+1];
else mid=c[n/2]>c[n/2+1]?c[n/2+1]:c[n/2];
printf("average = %.2lf\n",ave);
printf("max = %d\n",maxx);
printf("min = %d\n",minn);
printf("mid = %d",mid);
return 0;
}
题目五 区间最大值¶
Description¶
给定一个数组长度 N,数组内容和区间大小 K,请找出数组内所有区间里的最大值。
例如输入数组为:1 3 -1 -3 5 3 6 7;窗口大小为 3,则计算图示如下:
区间窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
输出为最大值组成的数组:3 3 5 5 6 7
Input¶
输入第一行首先给出一个正整数 N,表示数组长度 接下来一行给出数组内的N 个值,数字间以空格分隔 最后一行给出子区间的长度 K
Output¶
输出为N-K+1个整数,用空格间隔,方便起见,最后一个数字后也保留空格
Sample Input 1¶
8
1 3 -1 -3 5 3 6 7
3
Sample Output 1¶
3 3 5 5 6 7
Mycode¶
#include <stdio.h>
long n,m;
long a[66666],b[66666],maxx=-6666666;
int main(){
scanf("%ld",&n);
for(int i=1;i<=n;i++)scanf("%ld",&a[i]);
scanf("%ld",&m);
for(int i=1;i<=n-m+1;i++){
maxx=-6666666;
for(int j=0;j<m;j++){
if(a[i+j]>maxx)maxx=a[i+j];
}
b[i]=maxx;
}
for(int i=1;i<=n-m+1;i++)printf("%ld ",b[i]);
/*if(m>n){
maxx=0;
for(int i=1;i<=n;i++){
if(a[i]>maxx)maxx=a[i];
}
printf("%ld ",maxx);
}*/
if(m>n)printf(" ");
}
题目六 丑数¶
Description¶
丑数就是只包含质因数2、3和5的正整数。特别地,数字1为第一个丑数。 给你一个区间[m,n],输出区间[m,n]的丑数数量。 请实现两个函数解决此问题
函数接口定义:
int isUgly(int x);如果n是丑数返回1,否则返回0
int PrintUN(int m,int n);输出区间[m,n]的丑数数量
Input¶
输入两个正整数m,n代表一个正整数区间[m,n] (m<n)
Output¶
输出区间[m,n]的丑数数量
Sample Input 1¶
10 16
Sample Output 1¶
4
Hint¶
区间[10,16]有四个丑数
10=2*5
12=2*2*3
15=3*5
16=2*2*2*2
这些数只包含质因数2、3和5
Mycode¶
#include <stdio.h>
int m,n;
int isUgly(int x){
if(x==1)return 1;
int ttmp=x;
while(ttmp%2==0){
ttmp/=2;
}
while(ttmp%3==0){
ttmp/=3;
}
while(ttmp%5==0){
ttmp/=5;
}
if(ttmp==1)return 1;
return 0;
}
void PrintUN(int m,int n){
int ans=0;
for(int i=m;i<=n;i++){
if(isUgly(i))ans++;
}
printf("%d",ans);
}
int main(){
scanf("%d%d",&m,&n);
PrintUN(m,n);
return 0;
}