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

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 10
void 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 1000001
int 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 105
void 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;
}
程序截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值