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

xiaoxiao2021-02-28  28

导语: 先给前八道,下午上传剩下的。 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; }

传送门-剩下的题解

转载请注明原文地址: https://www.6miu.com/read-2299999.html

最新回复(0)