首页 > 学院 > 开发设计 > 正文

蓝桥杯——计算机研究生机试真题(2017.2.19)

2019-11-08 02:24:26
字体:
来源:转载
供稿:网友
1. (2012年北京大学计算机研究生机试真题)最简真分数题目描述:给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。输入:输入有多组,每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000。当n=0时,程序结束,不需要处理这组数据。输出:每行输出最简真分数组合的个数。样例输入:73 5 7 9 11 13 153 2 4 50样例输出:17 

2

源代码:

#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;#define maxn 610int Judge(int a,int b)                 //最简真分数判断{	int p;	while(b!=0)	{		p=a%b;		a=b;		b=p;	}	if(a>1)		return 0;	else		return 1;}int main(){	int n,a[maxn];	int i,j;	int count;	while(scanf("%d",&n)!=EOF)	{		count=0;		if(n==0)			break;		for(i=0;i<n;i++)			scanf("%d",&a[i]);		sort(a,a+n);           //排序+辗转相除法判断分子与分母是否有最大公约数		for(i=0;i<n;i++)		{			for(j=i+1;j<n;j++)			{				if(Judge(a[i],a[j]))					count++;			}		}		PRintf("%d/n",count);	}	return 0;}程序截图:

※2. (2007年清华大学计算机研究生机试真题)质因数的个数题目描述:求正整数N(N>1)的质因数的个数。相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。输入:可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。输出:对于每组数据,输出N的质因数的个数。样例输入:120样例输出:5提示:注意:1不是N的质因数;若N为质数,N是N的质因数。

源代码:

#include <stdio.h>#include <math.h>int is_Prime(int n)                       //判断一个数是否是质数(素数) {	int i;	int flag=1;	for(i=2;i<=sqrt(n);i++)	{		if(n%i==0)		{			flag=0;			break;		}	}	return flag;}int main(){	int N;	int i,j,count;	while(scanf("%d",&N)!=EOF)	{		j=sqrt(N);		count=0;		for(i=2;i<=j;i++)                 //判断一个质数i是否是N的因数 		{			while(N%i==0 && is_Prime(i))  //注意相同的质因数需要重复计算,故放到while循环内 			{				count++;				N/=i;			}			if(N==1)                      //while循环结束后N为1,直接跳出;否则找下一个质因数 				break;		}		if(N!=1)                          //以上循环结束后N是质数,表示此时的N也是N的质因数            count++;		printf("%d/n",count);	}	return 0;}程序截图:

3. 回文子串题目描述:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。输入:存在多组数据,每组数据一行字符串,长度不大于100。输出:输出回文子串的最大长度。样例输入:google样例输出:4

源代码:

#include <stdio.h>#include <string.h>#define maxlen 105int Judgestr(char str[],int len)           //判断字符串是否是回文串 {	int i=0,j=len-1;	int flag=1;	while(i<j)	{		if(str[i]!=str[j])		{			flag=0;			break;		}		i++,j--;	}	return flag;}int main(){	char str[maxlen],obj[maxlen];          //两数组分别保存源字符串与得到的回文子串 	int i,j,k,t;	int count,len,maxobjlen;	while(gets(str)!=NULL)	{		len=strlen(str);		count=2,maxobjlen=1;               //初始状态:从长度为2的子串开始找,回文子串长度为1 		for(t=0;t<len;t++)                 //三重循环:第一重-完成"回溯",即找完长度为j的子串后可以继续找长度为j+1的子串 		{			for(i=0;i<len;i++)             //第二重-确定子串起点			{				k=0;				for(j=i;j<i+count;j++)     //第三重-确定子串长度					obj[k++]=str[j];				obj[k]='/0';				if(Judgestr(obj,k))        //判断子串为回文串时,得到回文子串长度 					maxobjlen=count;       //如果没有符合上述要求的串,回文子串长度为1(一个字符也可以看做回文子串) 			}			count++;		}		printf("%d/n",maxobjlen);	}}程序截图:

※4. (2002年华中科技大学计算机研究生机试真题)统计单词题目描述:编一个程序,读入用户输入的,以“.”结尾的一行文字,统计一共有多少个单词,并分别输出每个单词含有多少个字符。(凡是以一个或多个空格隔开的部分就为一个单词)输入:输入包括1行字符串,以“.”结束,字符串中包含多个单词,单词之间以一个或多个空格隔开。输出:可能有多组测试数据,对于每组数据,输出字符串中每个单词包含的字母的个数。样例输入:hello how are you.样例输出:5 3 3 3

【分析】需要注意用scanf("%s",str); 或cin>>str; 输入字符串,在没有输入任何字符的时候按空格、回车是不算字符的,如本题输入(   hello   how are      you.)结果是一样的;在字符后面的空格为结束符,即变成(hello'/0' how'/0'are'/0'you.'/0'),只是这样最后一个空格比较难解决,幸好有题中说以'.为结束符,这样就有了界限,根据这个界限来换行,进行下一组输入。

        此外,也可将每个单词包含的字母个数存入一数组,可以比较灵活地实现输出。

源代码:

#include <stdio.h>#define maxlen 1010int main()  {	char str[maxlen];	int i,len;	while(scanf("%s",str)!=EOF)	{		len=0;		for(i=0;str[i]!='/0' && str[i]!='.';i++)			len++;		if(str[i]=='.')			printf("%d/n",len);		else			printf("%d ",len);	} 	return 0;}程序截图:

=====================================我是分割线=====================================

4. 拓展:输入一句话,统计这句话中包含多少个单词

源代码:

#include <stdio.h>#include <string.h>#define maxlen 1010int main()  {      char str[maxlen]={'/0'};      int i,flag,count=0;     while(gets(str)!=NULL)    {    	flag=0,count=0;              //flag开始置0可包括输入的第一个字符非空格的情况,意味着已有一个单词 		for(i=0;i<strlen(str);i++)  	    {                           	        if(str[i]==' ')          //判断当前字符是否是空格,若是,flag=0,  	            flag=0;	        else                     //若不是,判断当前字符前一个字符是否是空格,即flag是否等于0	        {	            if(flag==0)          //若前面是空格,则说明是新单词的开始,并将flag置为1 	            { 	                count++;  	                flag=1;  	            }  	        }	    }	    printf("%d/n",count);	}    return 0;  }程序截图:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表