蓝桥杯——计算机研究生机试真题改编+情景拓展(2017.2.9)

1. 输入两个长度不超过80且只含有字母的字符串(忽略字母大小写,即A与a、b与B、C与c… 相等),判断两字符串是否相等,相等输出Equal,否则输出Not equal

样例输入:

        ABC

        abc

样例输出:

        Equal

样例输入:

        abcd

        ABcdE

样例输出:

        Not equal

源代码:

法一:直接使用strcasecmp函数(类似strcmp函数,但忽略字母大小写)

#include <stdio.h>
#include <string.h>
#define maxlen 81
int main()
{
	char str1[maxlen],str2[maxlen];
	while(scanf("%s",str1)!=EOF)
	{
		scanf("%s",str2);
		if(strcasecmp(str1,str2)==0)
			printf("Equal\n");
		else
			printf("Not equal\n");
	}
	return 0;
}
法二:通过循环自主实现字符匹配

#include <stdio.h>
#include <string.h>
#define maxlen 81
int main()
{
	int i,flag;
	int len1,len2;
	char str1[maxlen],str2[maxlen];
	while(scanf("%s",str1)!=EOF)
	{
		scanf("%s",str2);
		len1=strlen(str1);
		len2=strlen(str2);
		flag=1;                          //1-Equal  0-Not equal
		if(len1!=len2)                   //字符串长度不等,直接判断Not equal 
			printf("Not equal\n");
		else
		{
			for(i=0;i<len1;i++)
			{
				if(str1[i]!=str2[i] && (str1[i]-32)!=str2[i] && (str1[i]+32)!=str2[i])  //有不同字符,Not equal 
				{
					flag=0;
					break;
				}
			}
			if(flag==1)
				printf("Equal\n");
			else
				printf("Not equal\n");
		}
	}
	return 0;
}
程序截图:


2. 货币问题

        已知有面值为1元,2元,5元,10元,20元,50元,100元的货币若干(可认为无穷多),需支付价格为x的物品,并需要恰好支付,即没有找零产生。求,至少需要几张货币才能完成支付。

例如,若支付价格为12元的物品,最少需要一张10元和一张2元,即两张货币就可完成支付。

输入:包含多组测试数据,每组仅包含一个整数p(1<=p<=100000000),为需支付的物品价格。

输出:对于每组输入数据,输出仅一个整数,代表最少需要的货币张数。

样例输入:
10
11
13

样例输出:
1
2
3

源代码:

#include <stdio.h>
int fun(int money[],int p)
{
	int i,t;
	int num=0;
	for(i=6;i>=0;i--)                          //从大到小遍历 
	{
		if(p>=money[i])
		{
			t=p/money[i];                      //t为需要某种面值货币的张数 
			p-=(money[i]*t);
			num+=t;
		}
	}
	return num;
}
int main()
{
	int p,count;
	int money[7]={1,2,5,10,20,50,100};         //money数组记录7种面值货币的张数 
	while(scanf("%d",&p)!=EOF)
	{
		count=fun(money,p);
		printf("%d\n",count);
	}
	return 0;
}
程序截图:


3. 调整数组顺序使奇数位于偶数前面

        输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

输入:每个输入文件包含一组测试案例。

             对于每个测试案例,第一行输入一个n(n<100000),代表该数组中数字的个数。

             接下来的一行输入n个整数。代表数组中的n个数。

输出:对应每个测试案例,输入一行n个数字,代表调整后的数组。

             注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。

样例输入:
5
1 2 3 4 5

样例输出:
1 3 5 2 4

源代码:

法一:另设两个数组分别保存奇偶数,然后分别输出(考虑到时间限制要求)

#include <stdio.h>
#define maxn 100000
void fun(int a[],int b[],int c[],int n)
{
	int i,j,t;
	int ji=0,ou=0;
	for(i=0;i<n;i++)             //ji ou用于统计奇偶数个数 
	{
		if(a[i]%2==0)
			b[ou++]=a[i];
		else
			c[ji++]=a[i];
	}
	for(i=0;i<ji;i++)            //奇偶数分别输出,先奇后偶 
		printf("%d ",c[i]);
	for(i=0;i<ou-1;i++)
		printf("%d ",b[i]);
	printf("%d\n",b[ou-1]);
}
int main()
{
	int i,n;
	int a[maxn],b[maxn],c[maxn];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		fun(a,b,c,n);
	}
	return 0;
}

法二:类似冒泡排序,进行n-1轮比较,每轮比较中又包含n-1趟比较(但此方法对规模较大的数据不适用,会出现TLE(超时)问题)

#include <stdio.h>
#define maxn 100000
void fun(int a[],int n)
{
	int i,j,t;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(a[j]%2==0 && a[j+1]%2!=0)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	for(i=0;i<n-1;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n-1]);
}
int main()
{
	int i,n;
	int a[maxn],b[maxn],c[maxn];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		fun(a,n);
	}
	return 0;
}
程序截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值