2019-5浙江工业大学计算机学院转专业一志愿机试题目

转专业机试结束了,发挥并不理想,自己感觉挺遗憾的,毕竟准备了很久,只能下次再来了。这次题目难度中等,与通关考相当。现在把这些题目分享出来,希望对想要转专业的朋友有帮助。如果还想继续练习的话,可以到浙工大onlinejudge练习(这个网站暂时不能访问,也可以到浙工大OPS上面有很多往年通关考真题)。
新oj网址:www.zjutacm.cn

相关链接
2019-6转专业二志愿机试题目
2019-12转专业一志愿机试题目

题号题目
2080 Problem A计算机学院欢迎你
2081 Problem B破解字符串的秘密
2082 Problem C各种数制转换问题
2083 Problem D年月日的一个巧合
2084 Problem E找亲密数对的游戏

Problem A: 计算机学院欢迎你

Description

请让电脑表达计算机学院对你的欢迎之情吧!

Input

无输入。

Output

输出样本示范内容,行末要回车。

Sample Input

Sample Output

Welcome to College of Computer Science & Technology!

这道题就是输出一个字符串,别忘了加换行

#include<iostream>
using namespace std;
int main()
{
cout<<"Welcome to College of Computer Science & Technology!"<<endl;
return 0;
}

Problem B: 破解字符串的秘密

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<iostream>
#include<cstring>
#include<ctype.h>
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;
 } 

Problem C: 各种数制转换问题

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<iostream>
#include<stdlib.h>
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++)//挨个处理数组中的元素
  {
   char 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;
   
  }
  cout<<endl;
 }
 return 0;
}

Problem D: 年月日的一个巧合

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<iostream>
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<1990) 
   cout<<"Data Error"<<endl;
 else  
 {   
  int date=1; //date用于记录总天数
  for(int y=1990;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;
}

Problem E: 找亲密数对的游戏

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 <iostream>
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,以下是代码oj测试

#include<iostream>
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;
}
  • 21
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值