哈工大历年复试编程题目及参考代码

导语:
先给前八道,下午上传剩下的。
QQ:3329998511
有更好的解法,欢迎互相学习讨论
传送门-剩下的题解

一 百鸡问题

1.题目描述

用小于等于n元去买100只鸡,大鸡5元/只,小鸡3元/只,还有1/3元每只的一种小鸡,分别记为x只,y只,z只。编程求解x,y,z所有可能解。

2.1输入描述:

测试数据有多组,输入n。

2.2输出描述:

对于每组输入,请输出x,y,z所有可行解,按照x,y,z依次增大的顺序输出。

3.示例1

输入

40

输出

x=0,y=0,z=100
x=0,y=1,z=99
x=0,y=2,z=98
x=1,y=0,z=99

4.题解

解法一:

#include <stdio.h>
  int main()
  {
      int x, y, z;
      for (x=0; x<=20; x++)
      {
          for (y=0; y<=33; y++)
          {
              z = 100 - x - y;
              if (5*x + 3*y + z/3 == 100&&z%3==0)
              {
                  printf("x=%d, y=%d, z=%d\n", x, y, z);
              }
          }
      }
      return 0;
  }

解法二:

#include<stdio.h>
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int x=0;x<=n/5;x++)
            for(int y=0;y<=n/3;y++){
                int z=100-x-y;
                int zz=z%3?z/3+1:z/3;
                if(z>=0&&5*x+3*y+zz<=n)
                    printf("x=%d,y=%d,z=%d\n",x,y,z);
            }
    }
    return 0;
}

二 互换最大最小数

1.题目描述

输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出。

2.1输入描述:

测试数据有多组,输入n(1<=n<=20),接着输入n个数。

2.2输出描述:

对于每组输入,输出交换后的结果。

3.示例1

输入

2
1 3

输出

3 1

4.题解

#include<stdio.h>
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int a[20]={0},min,max;
        scanf("%d",&a[0]);
        min=max=0;
        for(int i=1;i<n;i++){
            scanf("%d",&a[i]);
            if(a[i]>a[max])
                max=i;
            if(a[i]<a[min])
                min=i;
        }
        int temp=a[max];
        a[max]=a[min];
        a[min]=temp;
        for(int i=0;i<n;i++)
            printf("%d%c",a[i],i<n-1?' ':'\n');
    }
    return 0;
}

三 找X

1.题目描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

2.1输入描述:

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

2.2输出描述:

对于每组输入,请输出结果。

3.示例1

输入

2
1 3
0

输出

-1

4.题解

#include<stdio.h>
#include<stdlib.h>
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int *a=(int *)calloc(n,sizeof(int));
        for(int i=0;i<n;i++){
            scanf("%d",a+i);
        }
        int i=0,x;
        scanf("%d",&x);
        while(*(a+i)!=x&&i<n)
            i++;
        if(i==n)
            printf("%d\n",-1);
        else printf("%d\n",i);
    }
    return 0;
}

四 判断三角形类型

1.题目描述

给定三角形的三条边,a,b,c。判断该三角形类型。

2.1输入描述:

测试数据有多组,每组输入三角形的三条边。

2.2输出描述:

对于每组输入,输出直角三角形、锐角三角形、或是钝角三角形。

3.示例1

输入

3 4 5

输出

直角三角形

4.题解

#include<stdio.h>
int main(){
    int a,b,c;
    while(scanf("%d %d %d",&a,&b,&c)!=EOF){
        if(a==0) break;
        if(a+b<=c||b+c<=a||c+a<=b||a<=0||b<=0||c<=0){
                printf("输入有误!\n");
                continue;
        }
        if(a*a+b*b-c*c==0||b*b+c*c-a*a==0||c*c+a*a-b*b==0){
            printf("直角三角形\n");
        }else if(a*a+b*b-c*c>0&&b*b+c*c-a*a>0&&c*c+a*a-b*b>0){
            printf("锐角三角形\n");
        }else{
            printf("钝角三角形\n");
        }
    }
}

五 众数

1.题目描述

输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。

2.1输入描述:

测试数据有多组,每组输入20个1-10之间的数。

2.2输出描述:

对于每组输入,请输出1-10中的众数。

3.示例1

输入

5 1 5 10 3 5 3 4 8 6 8 3 6 5 10 7 10 2 6 2

输出

5

4.题解

#include<stdio.h>
#define NUM 20
int main(){
    int temp;
    while(scanf("%d",&temp)!=EOF){
        int a[11]={0};
        int max=1;
        a[temp]++;
        for(int i=1;i<NUM;i++){
            scanf("%d",&temp);
            a[temp]++;
        }
        for(int i=2;i<=10;i++)
            if(a[max]<a[i])
                max=i;
        printf("%d\n",max);
    }
    return 0;
}

六 最大公约数

1.题目描述

输入两个正整数,求其最大公约数。

2.1输入描述:

测试数据有多组,每组输入两个正整数。

2.2输出描述:

对于每组输入,请输出其最大公约数。

3.示例1

输入

49 14

输出

7

4.题解

#include<stdio.h>
#define NUM 20
int main(){
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF){
        int r;
        do{
            r=a%b;
            a=b;
            b=r;
        }while(r!=0);
        printf("%d\n",a);
    }
    return 0;
}

七 完数

1.题目描述

求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。

2.1输入描述:

测试数据有多组,输入n,n数据范围不大。

2.2输出描述:

对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。

3.示例1

输入

6

输出

6

4.题解

#include<stdio.h>
#define NUM 20
bool CompleteNum(int a){
    int sum=0;
    for(int i=1;i<=a/2;i++)
        if(a%i==0)
            sum+=i;
    if(a==sum)
        return 1;
    return 0;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int sum=0;
        int flag=1;
        for(int i=2;i<=n;i++)
        if(CompleteNum(i)){
            if(flag){
                flag=0;
                printf("%d",i);
            }else printf(" %d",i);
        }
        printf("\n");

    }
    return 0;
}

八 素数判定

1.题目描述

给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。

2.1输入描述:

测试数据有多组,每组输入一个数n。

2.2输出描述:

对于每组输入,若是素数则输出yes,否则输入no。

3.示例1

输入

13

输出

yes

4.题解

#include<stdio.h>
#include<math.h>
bool isPrime(int a){
    if(a<=1)
        return 0;
    for(int i=2;i<=sqrt(a);i++)
        if(a%i==0)
            return 0;
    return 1;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF)
        if(isPrime(n))
            printf("yes\n");
        else printf("no\n");
    return 0;
}

传送门-剩下的题解

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值