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

来源:互联网 发布:百度贴吧数据加载失败 编辑:程序博客网 时间:2024/06/06 01:36
1. (2010年清华大学计算机研究生机试真题)特殊乘法
题目描述:
写个算法,对2个小于1000000000的输入,求结果。
特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5
输入:
 两个小于1000000000的数
输出:
 输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
样例输入:
123 45
样例输出:

54

源代码:

#include <stdio.h>#define maxn 10void Init(int a[],int b[])              //数组初始化 {int i;for(i=0;i<maxn;i++){a[i]=0;b[i]=0;}}int Getwei(int n,int num[maxn])         //得到一个数的位数 {int i=n;int count=0;while(i){num[count++]=i%10;i/=10;}return count;}int Cal(int a[],int i,int b[],int j)    //进行特殊乘法计算 {int m,n;int sum=0;for(m=0;m<i;m++){for(n=0;n<j;n++)sum+=(a[m]*b[n]);}return sum;}int main(){int a,b,result;int numa[maxn],numb[maxn];          //numa numb数组分别保存a与b的各位数字 while(scanf("%d %d",&a,&b)!=EOF){Init(numa,numb);result=Cal(numa,Getwei(a,numa),numb,Getwei(b,numb));printf("%d\n",result);}return 0;}
程序截图:


※2. (2010年清华大学计算机研究生机试真题)整数拆分
一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的种数,例如f(7)=6.
要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入:
每组输入包括一个整数:N(1<=N<=1000000)。
输出:
对于每组数据,输出f(n)%1000000000。
样例输入:
7
样例输出:
6

【分析】奇偶讨论:

        对于奇数n=2k+1:它的拆分的第一项必然是1,推敲去掉这个1,其实就一一对应于2k的拆分,即f(2k+1)=f(2k);

        对于偶数n=2k:推敲有1和没有1的拆分。有1的拆分,与(2k-1)的拆分一一对应,与上方奇数的推导相同;没有1的拆分,将每项除以2,正好一一对应于k的所有拆分。即f(2k)=f(2k-1)+f(k).

        须要重视f(n)会很大,不要溢出。每一项对1000000000取模。

        此外,也可根据N比较小的各种情况进行归纳推理,得到方案数的变化规律。

源代码:

#include <stdio.h>#define maxn 1000001int f[maxn];                           //保存方案总数对1000000000的模 int main(){    int i,N;    while(scanf("%d",&N)!=EOF)    {        f[0]=1;        f[1]=1;        for(i=2;i<=N;i++)        {            if(i%2==0)                 //n为偶数时,方案数等于前一项与n/2项方案数之和再取模                 f[i]=(f[i-1]+f[i/2])%1000000000;            else                       //n为奇数时,方案数=n-1时的情况                 f[i]=f[i-1];        }        printf("%d\n",f[N]);    }}
程序截图:


※3. (2007年北京大学计算机研究生机试真题)单词替换

题目描述:
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入:
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格.
输出:
每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。
样例输入:
You want someone to help you
You
I
样例输出:
I want someone to help you

源代码:

#include <stdio.h>#include <string.h>#define maxlen 105void Match(char s[],char a[],char b[]){int i=0,j=0,k;int start=0,end=0;int flag;while(s[i]!='\0'){flag=0;if(s[i]==a[j]){i++;j++;}else{i=i-j+1;j=0;end=i;}if(a[j]=='\0' && (s[i]==' ' || s[i]=='\0')){for(k=start;k<end;k++)printf("%c",s[k]);for(k=0;k<strlen(b);k++)printf("%c",b[k]);j=0;start=i;end=start;flag=1;}}if(flag==0){for(k=start;k<end;k++)printf("%c",s[k]);}printf("\n");}int main(){char s[maxlen],a[maxlen],b[maxlen];while(gets(s)!=NULL){gets(a);gets(b);Match(s,a,b);}return 0;}
程序截图:


0 0
原创粉丝点击