转专业机试结束了,发挥并不理想,自己感觉挺遗憾的,毕竟准备了很久,只能下次再来了。这次题目难度中等,与通关考相当。现在把这些题目分享出来,希望对想要转专业的朋友有帮助。如果还想继续练习的话,可以到浙工大onlinejudge练习。
相关链接
2019-6转专业二志愿机试题目
2019-12转专业一志愿机试题目
题号 | 题目 |
---|---|
2080 Problem A | 计算机学院欢迎你 |
2081 Problem B | 破解字符串的秘密 |
2082 Problem C | 各种数制转换问题 |
2083 Problem D | 年月日的一个巧合 |
2084 Problem E | 找亲密数对的游戏 |
Description
请让电脑表达计算机学院对你的欢迎之情吧!
Input
无输入。
Output
输出样本示范内容,行末要回车。
Sample Input
无
Sample Output
Welcome to College of Computer Science & Technology!
这道题就是输出一个字符串,别忘了加换行
#include
using namespace std;
int main()
{
cout<<"Welcome to College of Computer Science & Technology!"<<endl;
return 0;
}
Description
编程高手能轻松破解任意字符串的秘密:一个字符串由多少数字字符、大写字母字符、小写字母字符、空格字符、其他字符构成。你也来试试看吧!
Input
按行输入多个字符串。
Output
对每一行字符串分别统计数字字符(D)、大写字母字符(B)、小写字母字符(S)、空格字符(K)、其他字符的个数(T),并输出。每行对应的输出以括号中的提示字母开头,然后跟统计值,行末回车。
Sample Input
Jennie Is A Nice Girl. She Is 18 Years Old.
??Really?&*AbaC% appE !
1 a 2 A 3 $b+123
Sample Output
D2B9S21K9T2
D0B4S10K2T7
D6B1S2K5T2
这是一道基础的字符串处理题,注意要用gets读入整行字符串,因为字符串内包含空格,而scanf和cin遇空格会停止读入,然后遍历整个字符串就好了
#include
#include
#include
using namespace std;
int main()
{
char p[1000];
while(gets(p))//不停读入字符串
{
int s=strlen(p);
int num=0; //以下五个变量用作计数器
int alpha=0;
int Alpha=0;
int space=0;
int Else=0;
for(int i=0;i<s;i++)//遍历字符串
{
if(isdigit(p[i])!=0)num++;
if(isupper(p[i])!=0) Alpha++;
if(islower(p[i])!=0) alpha++;
if(p[i]==' ') space++;
}
Else=s-num-Alpha-alpha-space; //用总长减去前面的就是其他字符的数量
cout<<"D"<<num<<"B"<<Alpha<<"S"<<alpha<<"K"<<space<<"T"<<Else<<endl;
}
return 0;
}
Description
在数制王国里,十进制不是唯一的成员。要怎么才能把十进制数转换为其他数制里的数呢?你有办法吗?
Input
多组输入,每组输入构成为:
要转换的数制N(N不大于16的自然数)
Output
每行给出的M个数,将它们统一转换成N进制数,一行一个。每组用空行分隔。
Sample Input
2
3 1 5 8
10
2 123 56
16
2 18 4567
14
3 45 14 20
Sample Output
1
101
1000
123
56
12
11D7
33
10
16
这道题其实就三步,一是动态分配一个数组,然后输入要转换的数;二是把待转换的数转换为n进制;三是把转换后的数输出。
#include
#include
using namespace std;
int main()
{
char o[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//这个数组用与存放最大的16进制中各位所代表的字符
int n;
while(cin>>n)
{
int m; cin>>m;
int *a=new int[m];//动态分配数组
for(int i=0;i<m;i++)
cin>>a[i];
for(int i=0;i<m;i++)//挨个处理数组中的元素
{
int sys[16];
int x=0;
int tmp=0;
while(a[i]!=0)//转换为n进值的数,并存进sys字符数组中,注意是倒序的,待会要倒序输出
{ tmp=a[i]%n;
sys[x++]=o[tmp];
a[i]/=n;
}
for(int j=x-1;j>=0;j--)//倒序输出
{
cout<<sys[j];
}
cout<<endl;
}
}
return 0;
}
Description
你有经常看日历的习惯吗?有发现一个数据的巧合吗?就是某个月的1号就是周一。你有用心数过一年里这样的月份有哪些吗?来数数看吧!
Input
多行输入,每行输入年份Y(Y≥1990,且已知1990的1月1日是周一)。
Output
对于每个Y,输出Y年哪些月的1号恰好是周一,月份之间用单空格分隔,行末无空格直接回车;没有这样的月份就输出空行;若Y小于1990则输出Data Error。具体格式如样本输出描述。
Sample Input
2019
2022
2021
1876
1998
1990
Sample Output
4 7
8
2 3 11
Data Error
6
1 10
这是一道很典型的年月日问题,只需要求出1990年1月1日到当前年份每个月的1号一共有多少天,然后对7取余,余数为1即为星期一
#include
using namespace std;
int main()
{
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//存放每个月的天数
int year;
while(cin>>year)
{
if(year<1900)
cout<<"Data Error"<<endl;
else
{
int date=1; //date用于记录总天数
for(int y=1900;y<year;y++) //把1990年开始到当前年份中每年的天数加起来
{
if(y%4==0&&y%100!=0||y%400==0)//判断是否为闰年
date+=366;
else date+=365;
}
if(year%4==0&&year%100!=0||year%400==0) month[2]=29;//若是闰年,2月份天数改为29天,这里用的是当前年份
else month[2]=28;
int flag=0;
for(int i=1;i<=12;i++) //从一月份开始判断,
{
if(date%7==1)
{
if(flag==0)flag=1;
else cout<<" ";
cout<<i;
}
date+=month[i]; //总天数加上一个月
}
cout<<endl;
}
return 0;
}
Description
你有你的亲密朋友,自然数也有。自然数中的亲密朋友描述如下:有两个不同的自然数a,b, 如果a所有的正因子(包括1但不包括a)之和等于b,b所有的正因子(包括1但不包括b)之和等于a,则a,b就是亲密朋友了,称为亲密数对。现在让我们来玩找亲密数对的游戏吧!
Input
多行输入,每行输入两个自然数M,N (M<=20000,N<=20000)。
Output
对于每行输入,输出M~N之间的所有亲密数对数和按a的升序显示所有的亲密数对(没有重复显示),格式为:亲密数对数n:[亲密数a1,亲密数b1] [亲密数a2,亲密数b2]……[亲密数an,亲密数bn];数据值或者区间不合法,则输出Data Error;没有亲密数对则输出0,行末回车。具体格式参看样本输出。
Sample Input
2 3000
100 2000
1000 80
2 3
3000 10000
Sample Output
3:[220,284] [1184,1210] [2620,2924]
2:[220,284] [1184,1210]
Data Error
0
2:[5020,5564] [6232,6368]
这道题暂时做不出来,大佬们自行解决吧
最近跟一个同样转专业的小伙伴交流了一下,他给出了E题效率更高的方法,运行时间只有几十ms,这里也分享给大家,学习了。
#include
using namespace std;
int f(int n){//求n的因子和
int sum=1;
for(int i=2;i*i<=n;i++){
if(n%i==0){
int b=n/i;
if(i*i==n)
sum+=i;
else
sum=sum+i+b;
}
}
return sum;
}
int main() {
int s1[100],s2[100],m,n;
while(cin>>m>>n){
if(m>20000||n>20000||m>=n)
cout<<"Data Error";
else{
int cnt=0;
int j=0;
for(int i=m;i<=n;i++){
int b=f(i);
if(b>i&&b<=n&&f(b)==i){ //判断b和i是否是亲密数对
cnt++;
s1[j]=i;
s2[j++]=b;
}
}
cout<<cnt;
if(cnt!=0)
cout<<":";
for(int i=0;i<j;i++){
cout<<"["<<s1[i]<<","<<s2[i]<<"]";
}
}
cout<<endl;
}
return 0;
}
改进:把题目中的数据范围代入后发现所有亲密数对只有八对,那为什么还要再算因子和,然后再一个一个比较呢,直接判断一下数的范围不就行了么?这次时间直接降到了0ms,以下是代码
#include
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
if(b<=a||a<0||b<0||a>20000||b>20000)
{
cout<<"Data Error"<<endl;
continue;
}
int sum=0; //记录组数
int res[16]; //存放结果
int r=0;
//对每一对亲密数对进行判断,如果在a~b的范围内,就放入结果数组中
if(a<=220&&b>=284)
{
res[r++]=220;
res[r++]=284;
sum++;
}
if(a<=1184&&b>=1210)
{
res[r++]=1184;
res[r++]=1210;
sum++;
}
if(a<=2620&&b>=2924)
{
res[r++]=2620;
res[r++]=2924;
sum++;
}
if(a<=5020&&b>=5564)
{
res[r++]=5020;
res[r++]=5564;
sum++;
}
if(a<=6232&&b>=6368)
{
res[r++]=6232;
res[r++]=6368;
sum++;
}
if(a<=10744&&b>=10856)
{
res[r++]=10744;
res[r++]=10856;
sum++;
}
if(a<=12285&&b>=14595)
{
res[r++]=12285;
res[r++]=14595;
sum++;
}
if(a<=17296&&b>=18416)
{
res[r++]=17296;
res[r++]=18416;
sum++;
}
if(sum==0)cout<<0<<endl;
else
{
cout<<sum<<":";
for(int i=0;i<r;i+=2)
{
if(i!=0)cout<<" ";
cout<<"["<<res[i]<<","<<res[i+1]<<"]";
}
cout<<endl;
}
}
return 0;
}