当前位置 博文首页 > 菜鸟的博客:蓝桥杯 2014年真题

    菜鸟的博客:蓝桥杯 2014年真题

    作者:[db:作者] 时间:2021-09-21 18:09

    真题1:
    题目:

    
    标题:猜年龄
    
        小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
    
        请你写出:小明的较小的妹妹的年龄。
    
    
    注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。
    

    思路:枚举

    //积是和的6倍
    //相差不超过8岁
    
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    
    int main(){
    	for(int i=1;;i++){
    		for(int j=1;j<=8;j++){
    			if((2*i+j)*6==i*(i+j)){
    				cout<<i<<" "<<i+j<<endl;
    				return 0; 
    			}
    		}
    	}
    } 
    
    

    真题2
    题目

    /*
    标题:切面条
    
        一根高筋拉面,中间切一刀,可以得到2根面条。
    
        如果先对折1次,中间切一刀,可以得到3根面条。
    
        如果连续对折2次,中间切一刀,可以得到5根面条。
    
        那么,连续对折10次,中间切一刀,会得到多少面条呢?
    
    答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。
    */
    

    思路:找规律 2^(折的次数)+1
    代码:

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int main(){
    	cout<<pow(2,10)+1<<endl;
    	return 0;
    }
    

    真题3:
    题目:

    
    标题:神奇算式
    
        由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
    
        比如: 
    
    210 x 6 = 1260 
    8 x 473 = 3784
    27 x 81 = 2187 
    
        都符合要求。
    
        如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
    
        请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
    
    

    思路:枚举+判断 8

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <sstream>
    using namespace std;
    int num[]={0,1,2,3,4,5,6,7,8,9};
    int vis[10000];
    void i2s(int x,string &b){
    	stringstream ss;
    	ss<<x;
    	ss>>b;
    } 
    int tonum(int s,int e){
    	int sum=0;
    	for(int i=s;i<e;i++){
    		sum*=10;
    		sum+=num[i];
    	}
    	return sum;
    }
    int main(){
    	int a,b,c;
    	string str_a,str_b,str_c,str_ab;
    	int lena;
    	int ans=0;
    	memset(vis,0,sizeof(vis));
    	do{
    		for(lena=1,a=tonum(0,lena);lena<4;a=tonum(0,++lena)){
    			i2s(a,str_a);
    			if(str_a[0]=='0') continue;
    			b=tonum(lena,4);
    			i2s(b,str_b);
    			if(str_b[0]=='0') continue;
    			c=a*b;
    			i2s(c,str_c);
    			if(str_c.length()!=4)continue;
    			str_ab=str_a+str_b;
    			int flag=1;
    			for(int i=0;i<str_ab.length();i++){
    				if(str_c.find(str_ab[i])==string::npos){
    					flag=0;
    					break;
    				}
    			}
    			if(flag&&vis[c]==0){
    				vis[c]=1;
    				ans++;
    				cout<<a<<"*"<<b<<"="<<c<<endl;
    			}
    			
    		}
    	}while(next_permutation(num,num+9));
    	cout<<ans<<endl;
    	return 0;
    }
    

    真题4:
    题目:

    
    标题:史丰收速算
    
        史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!
    
        速算的核心基础是:1位数乘以多位数的乘法。
    
        其中,乘以7是最复杂的,就以它为例。
    
        因为,1/7 是个循环小数:0.142857...,如果多位数超过 142857...,就要进1
    
        同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n
    
        下面的程序模拟了史丰收速算法中乘以7的运算过程。
    
        乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。
    
        乘以 7 的进位规律是:
    	满 142857... 进1,
    	满 285714... 进2,
    	满 428571... 进3,
    	满 571428... 进4,
    	满 714285... 进5,
    	满 857142... 进6
    
        请分析程序流程,填写划线部分缺少的代码。
    

    思路:挖空的地方在于进位,我看了一下代码进位的地方少了一个当都满足的时候,然后就是实验

    
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    //计算个位 
    int ge_wei(int a)
    {
    	if(a % 2 == 0)
    		return (a * 2) % 10;
    	else
    		return (a * 2 + 5) % 10;	
    }
    
    //计算进位 
    int jin_wei(char* p)
    {
    	char* level[] = {
    		"142857",
    		"285714",
    		"428571",
    		"571428",
    		"714285",
    		"857142"
    	};
    	
    	char buf[7];
    	buf[6] = '\0';
    	strncpy(buf,p,6);
    	
    	int i;
    	for(i=5; i>=0; i--){
    		int r = strcmp(level[i], buf);
    		if(r<0) return i+1;
    		while(r==0){
    			p += 6;
    			strncpy(buf,p,6);
    			r = strcmp(level[i], buf);
    			if(r<0) return i+1;
    		    return i;                 //填空
    		}
    	}
    	
    	return 0;
    }
    
    //多位数乘以7
    void f(char* s) 
    {
    	int head = jin_wei(s);
    	if(head > 0) printf("%d", head);
    	
    	char* p = s;
    	while(*p){
    		int a = (*p-'0');
    		int x = (ge_wei(a) + jin_wei(p+1)) % 10;
    		printf("%d",x);
    		p++;
    	}
    	
    	printf("\n");
    }
    
    int main()
    {
    	f("428571428571");
    	f("34553834937543");		
    	return 0;
    }
    

    真题5:
    题目:

    
    标题:锦标赛
    
       如果要在n个数据中挑选出第一大和第二大的数据(要求输出数据所在位置和值),使用什么方法比较的次数最少?我们可以从体育锦标赛中受到启发。
    
       如图【1.png】所示,8个选手的锦标赛,先两两捉对比拼,淘汰一半。优胜者再两两比拼...直到决出第一名。
    
       第一名输出后,只要对黄色标示的位置重新比赛即可。
    
       下面的代码实现了这个算法(假设数据中没有相同值)。
    
       代码中需要用一个数组来表示图中的树(注意,这是个满二叉树,不足需要补齐)。它不是存储数据本身,而是存储了数据的下标。   
       
       第一个数据输出后,它所在的位置被标识为-1
    

    思路:既然缺的代码是比较大小的代码,那么必须把大的留下来,全部代码都没有比较且a还没有用,所以尝试了一下 注意一个头文件<malloc.h>

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <malloc.h>
    using namespace std;
    void pk(int* a, int* b, int n, int k, int v)
    {
    	int k1 = k*2 + 1;
    	int k2 = k1 + 1;
    	
    	if(k1>=n || k2>=n){
    		b[k] = -1;
    		return;
    	}
    	
    	if(b[k1]==v) 
    		pk(a,b,n,k1,v);
    	else
    		pk(a,b,n,k2,v);
    	
    	//重新比较
    	if(b[k1]<0){
    		if(b[k2]>=0)
    			b[k] = b[k2]; 
    		else
    			b[k] = -1;
    		return;
    	}
    	
    	if(b[k2]<0){
    		if(b[k1]>=0)
    			b[k] = b[k1]; 
    		else
    			b[k] = -1;
    		return;
    	}
    	
    	if(a[b[k1]]>a[b[k2]])
    		b[k] = b[k1];
    	else
    		b[k] = b[k2];
    }
    
    //对a中数据,输出最大,次大元素位置和值 
    void f(int* a, int len)
    {
    	int n = 1;
    	while(n<len) n *= 2;
    	
    	int* b = (int*)malloc(sizeof(int*) * (2*n-1));
    	int i;
    	for(i=0; i<n; i++){ 
    		if(i<len) 
    			b[n-1+i] = i;
    		else
    			b[n-1+i] = -1;
    	}
    	
    	//从最后一个向前处理
    	for(i=2*n-1-1; i>0; i-=2){
    		if(b[i]<0){
    			if(b[i-1]>=0)
    				b[(i-1)/2] = b[i-1]; 
    			else
    				b[(i-1)/2] = -1;
    		}
    		else{
    			if(a[b[i]]>a[b[i-1]])
    				b[(i-1)/2] = b[i];
    			else
    				b[(i-1)/2] = b[i-1];
    		}
    	}
    	
    	//输出树根
    	printf("%d : %d\n", b[0], a[b[0]]);
    	
    	//值等于根元素的需要重新pk
    	pk(a,b,2*n-1,0,b[0]);
    	
    	//再次输出树根
    	printf("%d : %d\n", b[0], a[b[0]]);
    	
    	free(b);
    }
    
    
    int main()
    {
    	int a[] = {54,55,18,16,122,17,30,9,58};
    	f(a,9);	
    }
    
    cs
    下一篇:没有了