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

来源:互联网 发布:简易返利源码 编辑:程序博客网 时间:2024/06/04 18:57
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 81int main(){char str1[maxlen],str2[maxlen];while(scanf("%s",str1)!=EOF){scanf("%s",str2);if(strcasecmp(str1,str2)==0)printf("Equal\n");elseprintf("Not equal\n");}return 0;}
法二:通过循环自主实现字符匹配

#include <stdio.h>#include <string.h>#define maxlen 81int 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 equalif(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");elseprintf("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 100000void 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];elsec[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 100000void 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;}
程序截图:


0 0