杭电计算机复试笔试题

野题

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

解决方法:
image

#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;
}


posted @ 2023-04-01 15:36  太好了还有脑子可以用  阅读(4)  评论(0编辑  收藏  举报