杭电计算机复试笔试题
野题
1 最大公约数和最小公倍数
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入样例#:
5 7
输出样例#:
1 35
解决方法:
#include <stdio.h>
#include <math.h>
int main(){
int a,b,i;
scanf("%d %d",&a,&b);
int maxyue=0;
for(i=1;i<=fmax(a,b);i++){
if(a%i==0&&b%i==0)
maxyue=i;
}
int maxbei=0;
for(i=1;i<=b;i++){
if(a*i%b==0){
maxbei=a*i;
break;
}
}
printf("%d %d",maxyue,maxbei);
return 0;
}
2 字符棱形
输入一个整数n表示棱形的对角半长度,请你用*把这个棱形画出来。
输入:
3
输出:
*
***
*****
***
*
解决方法:
#include <stdio.h>
int main(){
int n,i,j;
scanf("%d",&n);
int s=2*n-1;
int num[s][s];
//主要盯牢左上角三角形,其他的就都可以解决了
//可以1输出,0不输出
//左上
int k0;
for(i=0;i<n;i++){
k0=n-i-1;
for(j=0;j<n;j++){
if(j<k0){
num[i][j]=0;
}else {
num[i][j]=1;
}
}
}
//右上
for(i=0;i<n;i++){
for(j=n;j<2*n-1;j++){
s=j-(n-1);
num[i][j]=num[i][n-1-s];
}
}
//往下翻
for(i=n;i<2*n-1;i++){
for(j=0;j<2*n-1;j++){
s=i-(n-1);
num[i][j]=num[(n-1)-s][j];
}
}
for(i=0;i<2*n-1;i++){
for(j=0;j<2*n-1;j++){
if(num[i][j]==1)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
3 快速排序
利用快速排序算法将读入的 N 个数从小到大排序后输出。
输入样例#:
5
4 2 4 5 1
输出样例#:
1 2 4 4 5
解决方法:
#include <stdio.h>
void swap(int a[], int low, int high);
int partition(int a[], int low, int high);
void quicksort(int a[], int low, int high);
int main(){
int n,i;
scanf("%d",&n);
int num[n];
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
quicksort(num, 0, n-1);
for(i=0; i<n; i++)
printf("%d ", num[i]);
return 0;
}
void swap(int a[], int low, int high){ //交换两个数的值
int temp = a[low];
a[low] = a[high];
a[high] = temp;
}
int partition(int a[], int low, int high){ //计算基准点,分割为左右两个数组
int point = a[low];//基准点等于第一个元素
while(low<high){
while(low<high && a[high]>=point){//控制high指针比较并左移
high--;
}
swap(a,low,high);
while(low<high && a[low]<=point){//控制low指针比较并右移
low++;
}
swap(a,low,high);
}
return low;//返回基准点位置
}
void quicksort(int a[], int low, int high){
if(low<high){
int point=partition(a,low,high);//计算基准点
quicksort(a,low,point-1);
quicksort(a,point+1,high);
}
}
4 上楼梯
N阶楼梯上楼问题:一次可以走三阶或两阶或一阶,问有多少种上楼方式。
输入样例#:
4
输出样例#:
7
解决方法:
①不用递归:
#include <stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int num[30];
num[1]=1;
num[2]=2;
num[3]=4;
for(i=4;i<=n;i++){
num[i]=num[i-1]+num[i-2]+num[i-3];
}
printf("%d",num[n]);
return 0;
}
②用递归:
#include <stdio.h>
int func(int n);
int main(){
int n,i;
scanf("%d",&n);
printf("%d",func(n));
return 0;
}
int func(int n){
switch (n) {
case 1:
return 1;
case 2:
return 2;
case 3:
return 4;
default:
return func(n-1)+func(n-2)+func(n-3);
}
}
2018
1 简单题
题目1:杭电实验室会定期去电影院看电影,按照惯例,每个成员需要先抽一个号码。
给出n个人的名字,各抽取一个数字, 自己用一种数据结构存取人的名字和抽取数字信息(票数)
输入
5
BOB 9
Alice 12
Tom 5
jack 7
Nick 4
输出:
chou:
BOB Alice Tom Nick
sort:
Nick 4 Tom 5 jack 7 BOB 9 Alice 12
1.定义一种数叫丑数,其因子除1外只有2.3.5的倍数,(例如4,10,是丑数,11,13不是),输出所有抽到丑数的人的名字
2. 根据个人所抽数字大小升序排序, 输出排序后的所有名字
#include <stdio.h>
int ischou(int n);
struct student{
char name[100];
int num;
};
int main(){
int n,i,j;
scanf("%d",&n);
struct student stu[n];
printf("\nchou:");
for(i=0;i<n;i++){
scanf("%s %d",stu[i].name,&stu[i].num);
if(ischou(stu[i].num)==1){
printf("%s ",stu[i].name);
}
}
printf("\n");
struct student temp;
int min;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++){
if(stu[j].num<stu[min].num){
min=j;
}
}
temp=stu[i];
stu[i]=stu[min];
stu[min]=temp;
}
printf("sort:\n");
for(i=0;i<n;i++){
printf("%s %d ",stu[i].name,stu[i].num);
}
}
int ischou(int n){
if(n%2==0||n%3==0||n%5==0){
return 1;
}
return 0;
}
3.现有一个新名字加入,将名字插入所有名字中间(n/2)处,并排序输出所有名字
没看懂,直接搞个姓名排序吧
输入:
5
BOB 9
Alice 12
Tom 5
jack 7
Nick 4
Add 4
输出:
sort: Add 4 Alice 12 BOB 9 Nick 4 Tom 5
解决方法:
#include <stdio.h>
#include <string.h>
struct student{
char name[100];
int num;
};
int main(){
int n,i,j;
scanf("%d",&n);
struct student stu[n+1];
for(i=0;i<n;i++){
scanf("%s %d",stu[i].name,&stu[i].num);
}
//add
scanf("%s %d",stu[n].name,&stu[n].num);
struct student temp;
//交换,插入到中间
temp=stu[n];
stu[n]=stu[n/2];
stu[n/2]=temp;
//按名字排序
int min;
for(i=0;i<n;i++){
min=i;
for(j=i+1;j<n+1;j++){
if(strcmp(stu[j].name,stu[min].name)<0){//找小
min=j;
}
}
temp=stu[i];
stu[i]=stu[min];
stu[min]=temp;
}
printf("sort:\n");
for(i=0;i<n;i++){
printf("%s %d ",stu[i].name,stu[i].num);
}
}
2019杭电计算机复试笔试题
1 简单题
1.电影院的座位分配为成年人的座位为奇数,非成年人的座位为偶数。现在输入一个N代表人数,依次输入N个有人的座位号,判断成年人有几个,所占比例是多少(保留小数点后两位),非成年人有几个,所占比例是多少(保留小数点后两位)。
input
5 5 3 2 6 11
output
3 0.60 2 0.40
解决方法:
#include <stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int num;
int jinum=0,ounum=0;
for(i=0;i<n;i++){
scanf("%d",&num);
if(num%2==1)
jinum++;
else
ounum++;
}
printf("%d %.2f %d %.2f",jinum,jinum*1.0/n,ounum,ounum*1.0/n);
return 0;
}
2 求最大面积
2.在二维坐标系中,做N条垂直线(与x轴垂直),起点为(i, 0),终点为(i, Yi)。i为自然数, 0<= i <= N。试从N条垂直线中取出2条并且与X轴形成一个凹型水槽,向其中注水,问如何选择垂线能使注入的水最多(即两条垂线的x坐标之差的绝对值乘上两条垂线段中y坐标较小的那个,得到的结果要最大)。先输入一个数N,代表垂线段的个数,在输入N个Yi(i = 0,1,2.....N-1)。
直接无脑复杂解决
input
11 2 8 6 7 4 8 9 2 7 3 5
output
49
解决方法:
#include <stdio.h>
#include <math.h>
int main(){
int n,i,j;
scanf("%d",&n);
int num[n];
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
int max=-100,temp;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
temp=(j-i)*fmin(num[i],num[j]);
if(max<temp)
max=temp;
}
}
printf("%d",max);
return 0;
}
2023预测
1008 数组元素循环右移问题
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(AA…Ax-_1)变换为(Av_Mw …Ax_1AoA…AN_M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N (1<N <100)和M(≥0)﹔第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
解决方案:
#include <stdio.h>
int main(){
int n,m,i;
scanf("%d %d",&n,&m);
int num[n];
//除去多余的无用的圈
if(m>n){
m=m%n;
}
for(i=0;i<n-m;i++){
scanf("%d",&num[i+m]);
}
int j=0;
for(i=n-m;i<n;i++){
scanf("%d",&num[j]);
j++;
}
for(i=0;i<n-1;i++){
printf("%d ",num[i]);
}
printf("%d",num[n-1]);
return 0;
}