蓝桥杯2013-2018试题初试-1

蓝桥杯2013-2018试题初试

1.今年多少岁?
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
    int m[10],n[10],k[10];
    for(int i=10;i<=30;i++)
    {
        int a=i*i*i;
        int b=a*i;
        int p=0,s=0;
        if(1000<=a&&a<10000&&b>=100000&&b<1000000)
        {
            int num=10000;
            int s_num=1000000;
            int q[10]={0,1,2,3,4,5,6,7,8,9};
            for(int j=0;j<4;j++)
            {
                m[j]=(a%num)/(num/=10);
            }
            for(int j=0;j<6;j++)
            {
                n[j]=(b%s_num)/(s_num/=10);
            }
      
          for(int j=0;j<4;j++)
            {
               k[j]= m[j];
            }
            for(int j=4;j<10;j++)
            {
                k[j]=n[p++];
            } 
            sort(k,k+10);  
          for(int j=0;j<10;j++)
          {
            if(k[j]==q[j])
            {
                s++;
            }                     
          }
          if(s==10)
         {
            cout<<i<<endl;
         }
        }   
    }    
    system("pause");
    return 0;
}
//注:更简单的做法为直接进行第一步的判断后人为观察那些数据符合题意。
2.马虎的算式
#include<iostream>
using namespace std;
int main()
{
    int num=0;
    for(int a=1;a<=9;a++)
    for(int b=1;b<=9;b++)
        if(b!=a)
            for(int c=1;c<=9;c++)
            if(c!=a&&c!=b)
                for(int d=1;d<=9;d++)
                    if(d!=a&&d!=b&&d!=c)
                    for(int e=1;e<=9;e++)
                    if(e!=a&&e!=b&&e!=c&&e!=d)
                    if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
                       {
                            num++;
                            cout<<(a*10+b)<<"*"<<(c*100+d*10+e)<<"=="<<(a*100+d*10+b)<<"*"<<(c*10+e)<<endl;                           
                       } 
                       cout<<num;
    return 0;
}
3.振兴中华
#include<iostream>
#include<algorithm>//C++算法头文件
using namespace std;
int f(int x,int y)
{
    if(x==3||y==4)
    return 1;
    return f(x+1,y)+f(x,y+1);
}
int main()
{
    cout<<f(0,0)<<endl;
    return 0;
}
/*注:关于递归的一些补充:
   递归算法考虑时有三个方面:
    1.函数的重复执行体是什么
    2.函数的出口在哪里
    3.函数要完成的功能是什么:主要体现在返回值的形式
   不要用循环的思想去理解递归,否则会被绕进去。
 */
4.幻方填空
/*
按照STL文档的描述,next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。
*/
#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
int check(vector<int> arr)
{
    int r1=29+arr[0]+arr[1];
    int r2=11+arr[2]+arr[3]+arr[4];
    int r3=9+arr[5]+arr[6]+arr[7];
    int r4=16+arr[8]+arr[9];
    int c1=25+arr[8]+arr[2];
    int c2=15+arr[0]+arr[3]+arr[5];
    int c3=11+arr[1]+arr[6]+arr[9];
    int c4=14+arr[4]+arr[7];
    int l=17+arr[3]+arr[6];
    int r=24+arr[5]+arr[8];

    if((r1==r2&&r2==r3&&r3==r4)&&(l==r)&&c1==c2&&c2==c3&&c3==c4)
    {
        cout<<arr[7];
    }
}
int main()
{
    int a[10]={2,3,4,5,6,7,8,10,12,14};
    vector<int> arr;
    for(int i=0;i<10;++i)
    {
        arr.push_back(a[i]);
    }
    do{
    #include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
void check(vector<int> arr)
{
    int r1=29+arr[0]+arr[1];
    int r2=11+arr[2]+arr[3]+arr[4];
    int r3=9+arr[5]+arr[6]+arr[7];
    int r4=16+arr[8]+arr[9];
    int c1=25+arr[8]+arr[2];
    int c2=15+arr[0]+arr[3]+arr[5];
    int c3=11+arr[1]+arr[6]+arr[9];
    int c4=14+arr[4]+arr[7];
    int l=17+arr[3]+arr[6];
    int r=24+arr[5]+arr[8];

    if((r1==r2&&r2==r3&&r3==r4)&&(l==r)&&c1==c2&&c2==c3&&c3==c4)
    {
        cout<<arr[7];
    }
}
int main()
{
    int a[10]={2,3,4,5,6,7,8,10,12,14};
    vector<int> arr;
    for(int i=0;i<10;++i)
    {
        arr.push_back(a[i]);
    }
    do{
        check(arr);
    }
    while(next_permutation(arr.begin(),arr.end()));
    return 0;
}  
   
5.带分数
#include<iostream>
#include<algorithm>
#include<array>
#include<string>
using namespace std;
int parse(array<int,9> arr,int pos,int len)
{
    int ans=0;
    int t=1;
    for(int i=pos+len-1;i>=pos;--i)
    {
        ans+=arr[i]*t;
        t*=10;
    }
    return ans;
}
int main()
{
    int n,ans=0;
    scanf("%d",&n);
   array<int,9> a = {1,2,3,4,5,6,7,8,9};
    do
    {
        for(int i=1;i<=7;++i)
        {
            int inta= parse(a,0,i);
            if(inta >= n)
            break;
            for(int j=1;j<=9-i-1;++j)
            {
                int intb=parse(a,i,j);
                int intc=parse(a,i+j,9-i-j);
                if(intb%intc==0&&inta+intb/intc == n)
                ans++;
            }

        }
    } while (next_permutation(a.begin(),a.end()));
    printf("%d\n",ans);
    system("pause");
    return 0;
}
//注:用array型的可能会不行,但是用string与vector<int>都可以,且用string需转为const char*,但是这个效率较快
6.猜字母
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string>
using namespace std;
int main(int argc, char const *argv[])
{
    char arr[2014];
    int num=0;
    for (int j = 0; j < 106; j++)
    {
         for (int i = 0; i <19; i++)
    {
         arr[num++]='a'+i;//通过循环给arr数组赋值得到拼接的字符串
    }
    }
    int len = 2014;
    while (len!=1)
    {
        int k=0;
        for (int i = 1; i < len; i+=2)
        {
          arr[k++]=arr[i];
        }  
       len=k;//k记录的就是每次len的长度
    }
    cout<<arr[0];
    return 0;
}
7.打印图形

/*  小明在X星球的城堡中发现了如下图形和文字:
rank=3
               *
              * *
             *   *  
            * * * *

rank=4
               *                                                      
              * *                                                     
             *   *                                                    
            * * * *                                                   
           *       *                                                  
          * *     * *                                                 
         *   *   *   *                                                
        * * * * * * * *  

rank=5
               *                                                      
              * *                                                     
             *   *                                                    
            * * * *                                                   
           *       *                                                  
          * *     * *                                                 
         *   *   *   *                                                
        * * * * * * * *                                               
       *               *                                              
      * *             * *                                             
     *   *           *   *                                            
    * * * *         * * * *                                           
   *       *       *       *  
  * *     * *     * *     * *  
 *   *   *   *   *   *   *   *
* * * * * * * * * * * * * * * *  

ran=6
                               *                                      
                              * *                                     
                             *   *                                    
                            * * * *                                   
                           *       *                                  
                          * *     * *                                 
                         *   *   *   *                                
                        * * * * * * * *                               
                       *               *                              
                      * *             * *                             
                     *   *           *   *                            
                    * * * *         * * * *                           
                   *       *       *       *                          
                  * *     * *     * *     * *                         
                 *   *   *   *   *   *   *   *                        
                * * * * * * * * * * * * * * * *                       
               *                               *                      
              * *                             * *                     
             *   *                           *   *                    
            * * * *                         * * * *                   
           *       *                       *       *                  
          * *     * *                     * *     * *                 
         *   *   *   *                   *   *   *   *                
        * * * * * * * *                 * * * * * * * *               
       *               *               *               *              
      * *             * *             * *             * *             
     *   *           *   *           *   *           *   *            
    * * * *         * * * *         * * * *         * * * *           
   *       *       *       *       *       *       *       *          
  * *     * *     * *     * *     * *     * *     * *     * *         
 *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *        
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *       
                                                                      

    小明开动脑筋,编写了如下的程序,实现该图形的打印
 */
#include<iostream>
 #include<stdlib.h>
 using namespace std;
#define N 70

void f(char a[][N], int rank, int row, int col)
{
	if(rank==1){
		a[row][col] = '*';
		return;
	}
	
	int w = 1;
	int i;
	for(i=0; i<rank-1/*5*/; i++) w *= 2;
	
	f(a,rank-1,row,col+w/2);//处理上面的第一个三角形
    //(a,5,0,16)
	f(a, rank-1, row+w/2, col);//处理左下角的三角形
    //(a,5,16,0)
	f(a, rank-1, row+w/2, col+w);//处理右下角的三角形
    //(a,5,16,32)
}
 
int main()
{
	char a[N][N];
	int i,j;
	for(i=0;i<N;i++)
	for(j=0;j<N;j++) a[i][j] = ' ';
	
	f(a,6,0,0);
	
	for(i=0; i<N; i++){
		for(j=0; j<N; j++) printf("%c",a[i][j]);
		printf("\n");
	}
	
	return 0;
}
8.神奇的算式
/*标题:神奇算式

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

比如:

210 x 6 = 1260 
8 x 473 = 3784
27 x 81 = 2187 
都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
*/
#include<iostream>
#include<stdlib.h>
#include<sstream>
#include<algorithm>
using namespace std;
bool check(int  res,int r)
{
    stringstream s2;
    stringstream s1;
    string s_r;
    string s_res;
    s2<<r;
    s2>>s_r;
    s1<<res;
    s1>>s_res;
    sort(s_r.begin(),s_r.end());
    sort(s_res.begin(),s_res.end());
    if(s_r==s_res)  
       return true;
    else
       return false;
}
int main(int argc, char const *argv[])
{
    int ans=0;
    for(int i=1;i<=9;i++)
       for(int j=0;j<=9;j++)
            if(j!=i)
                 for (int k = 0; k <= 9; k++)
                    if(k!=i&&k!=j)
                        for(int l=0;l<=9;l++)
                            if(l!=k&&l!=j&&l!=i)
                               {
                                     int res=l*1000+k*100+j*10+i;
                                     int r1=i*(j*100+k*10+l);
                                     if(check(res,r1))
                                     {
                                         ans++;
                                         cout<<res<<"   "<<i<<"*"<<(j*100+k*10+l)<<endl;
                                     }                                      
                                     int r2=(i*10+j)*(k*10+l);
                                     if(check(res,r2))  
                                        {
                                            ans++;   
                                            cout<<res<<"   "<<(i*10+j)<<"*"<<(k*10+l)<<endl;
                                        }       
                                        int r3=(i*100+j*10+k)*l;
                                        if(check(res,r3))  
                                        {
                                            ans++;   
                                            cout<<res<<"   "<<(i*100+j*10+k)<<"*"<<l<<endl;
                                        }       
                                          
                               } 
       
    cout<<ans;
    return 0;
}
/*
注:得到结果后需要手动排除其中重复的结果。
*/
9.分糖果
/*
    问题描述
  有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

  每个小朋友都把自己的糖果分一半给左手边的孩子。

  一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。

  反复进行这个游戏,直到所有小朋友的糖果数都相同为止。

  你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入格式
  程序首先读入一个整数N(2<N<100),表示小朋友的人数。
  接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出格式
  要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入
3
2 2 4
样例输出
4
 */

#include<iostream>
#include<stdlib.h>
#include<algorithm>
#define N 100//定义数组的最大上限
using namespace std;
bool check(int a[],int n)
{
    for(int i=0;i<n;i++)
    {
       if(a[i]!=a[0])
       return false;//若有一个值不同的话则返回false
    }
   return true;//若均相同的话则返回的是true
}
int main()
{
    int n;//孩子的数量
    int a[N];   
    int ans=0;
    cin>>n;//输入孩子的数量
    for(int i=0;i<n;i++)
    {
        cin>>a[i];//输入分配的糖果数
    }
    while (true)//给定一个死循环
    {
         int t=a[0];
         for(int i=0;i<=n-2;i++)
    {
         a[i]=a[i]/2;
         a[i]=a[i]+a[i+1]/2;
         if(a[i]&1==1)//判断是否是奇数
         {
             ans++;//老师分糖次数加一
             a[i]++;//糖的个数加一
         }
         if(check(a,n))//检查是否每个人的糖个数相同
        {
          cout<<ans<<endl;
          return 0;
        }
    }
        //需要考虑特殊的情况:小朋友们是环装的,但在抽象中是直线型的,故而要将最后一个值拿出来与第一个值进行特殊的处理。处理方式与普通情况相同。
        a[n-1]=a[n-1]/2;
        a[n-1]=a[n-1]+t/2;
        if(a[n-1]&1==1)
        {
            ans++;
            a[n-1]++;
        }
        if(check(a,n))
        {
          cout<<ans<<endl;
          return 0;
        }
    }   
}

试题原题在蓝桥官网均可查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值