21年复试上机题目
1.一志愿机试题
(一) 不在数列中的数字
题目描述:
给出一个长度为 n 的数列,包含 1 到 n 的数字,输出 1 到 n 中不在数列中的数字。
题目输入:
第一行一个数字 n,表示数组长度。(1≤n≤1e5)
第二行 n 个用空格隔开的数字,分别表示数组中 n 个数字。(1≤ai≤n)
输入案例:
8
4 3 2 7 8 2 3 1
输出案例:
2
5
6
解决方法:
#include<stdio.h>
int main(){
int n,i,num=0;
scanf("%d",&n);
int a[n];
int b[n+1];//因为是1到n;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=i;
}
for(i=0;i<n;i++){
b[a[i]]=0;
}
//就这个num要输出,不然也没好的办法,只能再来一次循环
for(i=1;i<=n;i++){
if(b[i]!=0){
num++;
}
}
printf("%d\n",num);
for(i=0;i<n;i++){
if(b[i]!=0){
printf("%d\n",b[i]);
}
}
}
(二) 输出 Ascii 码
题目描述:
输出"I want to take the MS's rocket to live in the MS's ice castle."的 ascii 码。
题目输入:
无输入
题目输出:
输出一行,以空格分隔每个 ascii 码。
Sample 仅供参考格式,并非正确答案。
解决方法:
#include<stdio.h>
int main(){
char a;
while((a=getchar())!=EOF){
printf("%d ",a);
}
}
(三) 荧光屏编程
题目描述:
荧光屏编程(具体看样例即可,玩过计算器的都懂)
题目输入:
输入四个整数 a,b,c,d(0<=a,b,c,d<=9)
题目输出:
输出一个 5×23 的字符串矩阵,‘-’表示不亮,‘*’表示亮,每两个数字显示之间有一列空格(末
尾没有)
输入案例:
1 2 3 4
输出示例:
解决方法:
#include<stdio.h>
void print1(int a);
void print2(int a);
void print3(int a);
void print4(int a);
void print5(int a);
int main(){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
print1(a);
printf(" ");
print1(b);
printf(" ");
print1(c);
printf(" ");
print1(d);
printf("\n");
print2(a);
printf(" ");
print2(b);
printf(" ");
print2(c);
printf(" ");
print2(d);
printf("\n");
print3(a);
printf(" ");
print3(b);
printf(" ");
print3(c);
printf(" ");
print3(d);
printf("\n");
print4(a);
printf(" ");
print4(b);
printf(" ");
print4(c);
printf(" ");
print4(d);
printf("\n");
print5(a);
printf(" ");
print5(b);
printf(" ");
print5(c);
printf(" ");
print5(d);
printf("\n");
return 0;
}
//擦,只能一行一行输出
void print1(int a){
switch (a) {
case 1:
printf("----*");
break;
case 2:
case 3:
case 5:
case 6:
case 7:
case 8:
case 9:
printf("*****");
break;
case 4:
printf("*---*");
break;
}
}
void print2(int a){
switch (a) {
case 1:
case 2:
case 3:
case 7:
printf("----*");
break;
case 4:
case 8:
case 9:
printf("*---*");
break;
case 6:
case 5:
printf("*----");
break;
}
}
void print3(int a){
switch (a) {
case 1:
case 7:
printf("----*");
break;
case 2:
case 3:
case 5:
case 6:
case 8:
case 9:
case 4:
printf("*****");
break;
}
}
void print4(int a){
switch (a) {
case 1:
case 3:
case 5:
case 4:
case 7:
case 9:
printf("----*");
break;
case 2:
printf("*----");
break;
case 6:
case 8:
printf("*---*");
break;
}
}
void print5(int a){
switch (a) {
case 1:
case 9:
case 4:
case 7:
printf("----*");
break;
case 2:
case 3:
case 5:
case 6:
case 8:
printf("*****");
break;
}
}
(四) 非常简单的数学题
题目描述:
题目输入:
第一行一个正整数 T,表示有 T 组询问(T<100)。
后面 T 行,每行一个正整数 n(1<=n<=10^12)。
题目输出:
输出 T 行,表示 T 组询问的答案
输入案例:
3
5
8
1000000000000
输出案例:
8
17
488099925
解决方法:
数字太大了,不会
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
__int64 fn1(int n);
double ceil(double x);
int main(){
__int64 t,n,x;
scanf("%ld",&t);
while(t>0){
scanf("%ld",&n);
x=fn1(n)%1000000007;
printf("%I64d\n",x);
t--;
}
return 0;
}
__int64 fn1(int n){
__int64 sum=0;
for(int k=1;k<=n;k++){
sum=sum+ceil(log2(k));
}
return sum;
}
(五) AB 博弈
题目描述:
给出一个正整数 N,A 和 B 轮流可以对这个数进行操作,包括减 1 操作和减 2 操作,A 先操
作,当这个数变为 0 后两者就停止操作,不能将这个数减成负数。
A 和 B 都希望成为把这个数减成 0 的人,假设两者都用各自的最佳策略,问最后谁把这个数
减成了 0。
题目输入:
多组数据,每一行输入一个数字 n,题意中的正整数等于 n+1。
题目输出:
对于每一个输入输出一行答案
如果 A 最终将这个数减为了 0,输出:“Brother Chao will get the gold nugget!”
如果 B 最终将这个数减为了 0,输出:“PangPang will get the gold nugget!”
没有双引号
输入案例:
3
5
输出案例:
Brother Chao will get the gold nugget!
PangPang will get the gold nugget!
解决方法:
#include<stdio.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
n=n+1;
if(n%3==0)
printf("PangPang will get the gold nugget!\n");
else
printf("Brother Chao will get the gold nugget!\n");
}
return 0;
}
(六) 简单找区间
题目描述:
给你 n 个数,然后找一个区间[l,r],使这个区间的平均值最大,直接输出这个最大的平均值
就行了
题目输入:
输入数据有多组,直到文件结束符,每组只有一两行。
第一行一个 n,表示下面有 n 个数。(1<=n<=10000)
第二行 n 个数,a1,a2......an。表示 n 个数字,-1000000≤ai≤1000000
题目输出:
输出某区间的最大平均值,区间不用输出,直接输出最大值即可。(如果含小数,则取整数部分)
输入案例:
1
1
3
3 3 3
5
1 2 3 4 5
输出案例:
1
3
5
解决方法:
找数中的最大值输出
#include<stdio.h>
int main(){
int n,i,j,max,temp;
while((scanf("%d",&n))&&n!=EOF){//文件结束符
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for (i=0; i<n-1;i++) {
max=i; //p用于记录最小元素的下标
for (j=i+1;j<n;j++) { //找到剩下元素中最小的那一个
if (a[max]<a[j])
max=j;
}
temp = a[i]; //temp是交换两数时的中间变量
a[i] = a[max];
a[max] = temp;
}
printf("%d\n",a[0]);
}
return 0;
}
(七) 数字博弈
题目描述:
A 和 B 各手持一个数字 a、b。两者轮流操作,A 先开始,每次挑选如下的操作进行一次:
- 翻转,如 s=123,翻转后为 321
- 整除 10,如 s=123,整除 10 后变为 12
每个人只能操作自己的数字,如果出现 A 和 B 的数字相等则 A 赢,否则游戏不会停止。双方尽可能采取最优策略。问 A 能够赢下比赛或是无法停止游戏。
题目输入:
第一行输入一个 T(1<=T<=10),表示 T 个测试样例。
对于每个测试样例,有两个数字 a 和 b,1<=a,b<=10^500000,并且 a 和 b 都不为 0。
题目输出:
对于每个测试样例,如果 A 可以赢得游戏,输出“lyh nb”;否则输出“xyh nb”。
输入案例:
4
11111 1
1 11111
12345 54321
123 123
输出案例:
lyh nb
xyh nb
lyh nb
lyh nb
解决方法:
(不确定,大致写了一点,但是有些还是想不通)
#include<stdio.h>
int reserve(int n);
int chu10(int n);
int lens(int n);
int main(){
int t,i;
int a,b,lena,lenb;
char *s;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%d%d",&a,&b);
lena=lens(a);
lenb=lens(b);
//只能a想方设法去跟b相同
//坏坏,第二种情况,只要b的长度比a长,b就会想方设法不跟a相等
if(lena>=lenb){
if(a==b||reserve(a)==b||reserve(a)==reserve(b)||a==reserve(b))
printf("%s\n","lyh nb");
else{
if(chu10(a)==chu10(b)&&lena>lenb)
//坏坏,第二种情况,只要b的长度比a长,b就会想方设法不跟a相等
printf("%s\n","lyh nb");
else
printf("%s\n","xyh nb");;
}
}else{
printf("%s\n","xyh nb");;
}
}
return 0;
}
int reserve(int n){//翻转
int result=0;
while(n>0){
result=result*10+n%10;
n=n/10;
}
return result;
}
int chu10(int n){
while(n>10)
n=n/10;
return n;
}
int lens(int n){
int len=0;
while(n>0){
len++;
n=n/10;
}
return len;
}
2.调剂上机题
(一) 简单字符串
题目描述:
如果一个字符串中有连续两个字符重复,那么视为出现了复读。请判断给出的字符串是否出现了复读。
题目输入:
第一行为一个整数 t(1≤t≤10)代表数据组数
接下来有 t 行,每行一个字符串,只包含小写字母(字符串长度小于等于 1000)
题目输出:
对于每一个字符串,输出一行。如果有连续两个字符重复,那么视为出现了复读,输出“Yes”,否则输出“No”。
输入案例:
2
aab
aba
输出案例:
Yes
No
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int t,lena,i,flag;
scanf("%d",&t);
char a[1000];
while(t>0){
flag=0;
scanf("%s",a);
lena=strlen(a);
for(i=1;i<=lena;i++){
if(a[i-1]==a[i]){
printf("Yes\n");
flag=1;
break;
}
}
if(flag==0)
printf("No\n");
t--;
}
return 0;
}
(二) 括号和括号
题目描述:
有一串字符串只包含'('和')',判断其是否为合法的括号匹配,每个'('均能在其右边找到与之唯一匹配的')'即合法。
题目输入:
第一行为一个整数 T(T<=100),表示 T 个测试数据。
接下来 T 行每行一个字符串 s(只包含'('和')',|s|<1e5)
题目输出:
如果是合法匹配输出 Yes,否则输出 No。每个输出都为一行。
输入案例:
2
(()(())()(()()))
())())((()(())
输出案例:
Yes
No
解决方法:
方法1:减1加1
#include<stdio.h>
#include <string.h>
int main(){
int t,num=0,i,lena;
char a[10000];
scanf("%d",&t);
while(t>0){
scanf("%s",a);
lena=strlen(a);
for(i=0;i<lena;i++){
if(a[i]=='(')
num++;
else if(a[i]==')'){
num--;
if(num<0){
printf("No");
break;
}
}
}
if(num==0)
printf("Yes");
t--;
}
return 0;
}
方法2:用栈来实现
#include<stdio.h>
#include <string.h>
int main(){
char s[100],temp;
char zhan[100];
int top=-1;
int t,i,j;
scanf("%d",&t);
int len;
for(i=0;i<t;i++){
scanf("%s",s);
top=-1;
len=strlen(s);
j=0;
while(j<len){
temp =s[j];
if(top==-1){//栈为空时
top++;
zhan[top] = temp;
}else{
//( 入栈
if(temp=='('){
top++;
zhan[top] = temp;
}else {
if(temp==')'){
if(zhan[top]=='(')
top--;
else
break;
}
}
}
j++;
}
if(top==-1)
printf("%s","Yes");
else
printf("%s","No");
}
return 0;
}
(三) 被吃掉的数字
题目描述:
假设有一个基数 a 和一个长度为 n 的序列,该序列为 a+1,a+2,a+3,…,a+n-1,a+n。现将该序列打乱后,拿掉一个数,问拿掉的那个数在原序列的序号是多少
题目输入:
第一行输入一个正整数 n,表示原始的序列的长度。
第二行输入另一个正整数,表示基数 a。
第三行输入 n-1 个正整数 ai,表示被打乱顺序后的序列。
保证输入合法(2≤n≤2000,1e9<=a<=2e9,a+1≤ai≤a+n)
题目输出:
输出一个正整数,表示被拿走的数的序号。
输入案例:
5
1000000100
1000000102 1000000105 1000000101 1000000103
输出案例:
4
解决方法:
#include<stdio.h>
#include <string.h>
int main(){
int n,a,i,b;
scanf("%d%d",&n,&a);
int arr[n+1];
for(i=0;i<=n;i++){
arr[i]=i;
}
//输入n-1个值
for(i=0;i<n-1;i++){
scanf("%d",&b);
arr[b-a]=0;
}
for(i=0;i<=n;i++){
if(arr[i]!=0){
printf("%d\n",i);
break;
}
}
return 0;
}
(四) 最低成本的目标
题目描述:
现在有一个数初始为 0,花费 1 点成本使得这个数+1,花费 50 点成本使这个数+100,你可以进行若干次上述的两种操作,在最后可以花费 500 点成本使该数翻倍。问至少需要多少成本使得这个数字达到目标数 N 或 N 以上。
题目输入:
目标数 N(N >= 30000)
题目输出:
最小成本数
输入案例:
101
输出案例:
51
解决方法:(不确定)
#include<stdio.h>
int main(){
int n,sum=0;
scanf("%d",&n);
sum=(n/100)*50+n%100;
printf("%d",sum);
return 0;
}
(五) 正反画画
题目描述:
如果在一个二维平面 xOy 中,有三个不同的点 A(x1,y1),B(x2,y2),C(x3,y3),根据这三个点的顺序进行画圆,想象一下,从 A 点开始画圆,穿过 B 点,再穿过 C 点,最后回到 A 点完成画圆,问判断出这样是按顺时针画圆还是按逆时针画圆。
题目输入:
第一行包含一个整数 T(1≤ T ≤ 1000),表示测试用例的数量。
在接下来的 T 行中,每一行包含 6 个用空格分隔的整数 x1、y1、x2、y2、x3、y3(-1000
≤ x1、y1、x2、y2、x3、y3 ≤ 1000)。
保证 A、B、C 三个点各不相同。
题目输出:
对于每个测试用例,若结果为顺时针,则输出“Clockwise”,若结果为逆时针,则输出“Counterclockwise”(不用输出引号)
输入案例:
3
1 2 2 1 -1 -2
4 3 -4 3 3 4
4 -3 4 3 3 4
输出案例:
Clockwise
Clockwise
Counterclockwise
解决方法:
/*设 p1=(x1,y1), p2=(x2,y2), p3=(x3,y3)
求向量
p12=(x2-x1,y2-y1)
p23=(x3-x2,y3-y2)
则当 p12 与 p23 的叉乘(向量积)*/
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
while(n>0){
//结果大于0为逆时针,小于0为顺时针,结果等于0在同一条直线
int x1,y1,x2,y2,x3,y3,result=0;
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
result= (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2) ;
if(result>0)
printf("Counterclockwise\n");
else if(result<0)
printf("Clockwise\n");
n--;
}
return 0;
}
(六) 有趣的进制数
题目描述:
2992 这个数的十进制数四位数字之和为 2+9+9+2=22,它的十六进制数为 BB0,其四位数字之和也为 22,同时它的十二进制数表示 1894,其四位数字之和也为 22。请判断任意一个十进制的四位数,是不是满足上述规则。
题目输入:
输入含有一些四位正整数,如果为 0,则输入结束。
题目输出:
若 n 为满足上述规则,则输出“#n is a GOD number.”,否则输出“#n is not a GOD number.”。
每个结果占一行。注意:#n 表示所读入的 n 值。
输入案例:
2992
1234
0
输出案例:
2992 is a GOD number.
1234 is not a GOD number.
解决方法:
#include<stdio.h>
#include <string.h>
int fuc1(int n);
int fucto16(int n);
int fucto12(int n);
int main(){
int n;
while(scanf("%d",&n)&&n!=0){
int n1,n2,n3;
//输入十进制,四位数之和的值
n1=fuc1(n);
//转换为十六进制,四位数之和的值
n2=fucto16(n);
//转换为十二进制,四位数之和的值
n3=fucto16(n);
if(n1==n2&&n2==n3&&n1==n3){
printf("%d is a GOD number.\n",n);
}else {
printf("%d is not a GOD number.\n",n);
}
}
return 0;
}
int fuc1(int n){
int sum=0;
while(n>0){
sum=sum+n%10;
n=n/10;
}
return sum;
}
int fucto16(int n){
int sum=0;
while(n>0){
sum=sum+n%16;
n=n/16;
}
return sum;
}
int fucto12(int n){
int sum=0;
while(n>0){
sum=sum+n%12;
n=n/12;
}
return sum;
}
(七) 一起来 abc
题目描述:
已知 a 和 b 的范围是 0 到 1000000,c 的范围是 0 到 1000000,请问有多少种满足条件的三元组(x, y, z) 满足 x + y = z。其中 x ∈ [0, a] 且 y ∈ [0, b] 且 z ∈ [0, c]
题目输入:
输入三个整数 a,b,c
0 ≤ a ≤1000000
0 ≤ b ≤1000000
0 ≤ c ≤1000000
题目输出:
输出满足条件的三元组个数
输入案例:
2 2 2
输出案例:
6
解决方法:
写出来也是超时的,不会做
#include<stdio.h>
int fun1(int sum,int c);
int main(){
int a,b,c;
int sum=0,i,j,n=0;
scanf("%d%d%d",&a,&b,&c);
//x+y=z,z的范围为[0,z],可以把x+y的值送入判断比z小,就++;
for(i=0;i<=a;i++){//x的值
for(j=0;j<=b;j++){
sum=i+j;
if(fun1(sum,c)==1){
n++;
}
}
}
printf("%d",n);
return 0;
}
int fun1(int sum,int c){
int flag=0;
if(sum>=0&&sum<=c)
flag=1;
return flag;
}
标签:case,输出,题目,上机,int,工商,复试,printf,输入
From: https://www.cnblogs.com/ZarkY/p/17182083.html