蓝桥专场小结

最近在刷蓝桥杯的题,没有时间一道题一篇博客的整理了,就跳着重点写一写吧,也加深一下自己的印象
特殊回文数,这道题就是一个简单的回文数题目,他要的是所有5位数、6位数中的回文数,同时要满足这五个数或六个数加起来的和等于给定的数。
因为题目给定的n比较大,要考虑在for循环中添加条件,减少时间复杂度
我用了比较弱智的办法去做,就不写思路了,但是我用了vector,真的,好好用,一定要会用它!!!还有就是要注意一些边界条件,边界点,如:最高位不能为0!!不考虑这个的话就会测试样例卡住的。
那这道题的话,就写一写vector的一些点吧:

	vector<int> a;//定义
	sort( a.begin(), a.end() );//排序
    a.erase( unique( a.begin(), a.end() ), a.end() );//去重
    for(vector<int>::iterator it=a.begin();it!=a.end();it++)//遍历
        cout<<*it<<endl;

我觉得上边这几行代码蛮重要的(蛮好用的!)
好了,剩下的没了,上代码
特殊回文数

#include <bits/stdc++.h>

using namespace std;
//最高位不可为0
int main()
{
    int n;
    cin>>n;
    vector<int> a;


    for(int i=0;i<10;i++)
    {
        if(5*i>n)
        {
            break;
        }
        if(5*i==n&&i!=0)
        {
            a.push_back(i*10000+i*1000+i*100+i*10+i);

        }

        if(6*i==n&&i!=0)
        {
            a.push_back(i*100000+i*10000+i*1000+i*100+i*10+i);

        }

    }
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            if(2*i+3*j>n)
                break;
            if(2*i+3*j==n)
            {
                if(i!=0)
                a.push_back(i*10000+j*1000+j*100+j*10+i);
                //num++;
                if(j!=0)
                a.push_back(j*10000+i*1000+j*100+i*10+j);
                //num++;
            }
            if(4*i+2*j==n)
            {
                if(i!=0)
                {
                    a.push_back(i*100000+i*10000+j*1000+j*100+i*10+i);

                a.push_back(i*100000+j*10000+i*1000+i*100+j*10+i);

                }
                if(j!=0)
                a.push_back(j*100000+i*10000+i*1000+i*100+i*10+j);

            }
        }
    }
    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++)
        {
            for(int k=0;k<10;k++)
            {
                if(2*i+2*j+k>n)
                    break;
                if(2*i+2*j+k==n)
                {
                    if(i!=0)
                    a.push_back(i*10000+j*1000+k*100+j*10+i);
                    if(j!=0)
                    a.push_back(j*10000+i*1000+k*100+i*10+j);

                }
                if(2*i+2*j+2*k==n)
                {
                    if(j!=0)
                    {
                        a.push_back(j*100000+i*10000+k*1000+k*100+i*10+j);

                    a.push_back(j*100000+k*10000+i*1000+i*100+k*10+j);

                    }
                    if(i!=0)
                    {
                        a.push_back(i*100000+j*10000+k*1000+k*100+j*10+i);

                    a.push_back(i*100000+k*10000+j*1000+j*100+k*10+i);

                    }

                    if(k!=0)
                    {
                        a.push_back(k*100000+j*10000+i*1000+i*100+j*10+k);

                    a.push_back(k*100000+i*10000+j*1000+j*100+i*10+k);

                    }


                }
            }
        }
    }
    sort( a.begin(), a.end() );
    a.erase( unique( a.begin(), a.end() ), a.end() );
    for(vector<int>::iterator it=a.begin();it!=a.end();it++)
        cout<<*it<<endl;
    return 0;
}

十进制转十六进制,这道题的话,也用到了一个东西——map,嗯!好用
这个题目的关键就是了解十进制转R进制的过程:不断地模R取余,倒序输出,所以我的做法就是:只要num不等于0,就不断的将模16的余数存到数组里,然后num/16,反复执行,直到跳出循环
然后用一个map将十进制的数字对应的十六进制字符记录,然后查map,加字符串,最后输出就可了(要注意倒序!!)
还有就是map类型的定义:

map<int,char> a;//<>里前面是key的类型,后面是value的类型

还有一个小坑坑就是:num给的就是0的时候,这时候是进不去循环的,一定要单独说明!!!
好了,上代码
十进制转十六进制

#include <bits/stdc++.h>

using namespace std;

int main()
{
    map<int,char> a;
    a[0]='0';
    a[1]='1';
    a[2]='2';
    a[3]='3';
    a[4]='4';
    a[5]='5';
    a[6]='6';
    a[7]='7';
    a[8]='8';
    a[9]='9';
    a[10]='A';
    a[11]='B';
    a[12]='C';
    a[13]='D';
    a[14]='E';
    a[15]='F';
    long long num;
    cin>>num;
    if(num==0)
    {
        cout<<0<<endl;
        return 0;
    }
    int h[15];
    int length=0;
    while(num!=0)//忽略了初始为0的情况
    {
        h[length]=num%16;
        num=num/16;
        length++;
    }
    string s="";
    for(int i=length-1;i>=0;i--)
    {
        //cout<<a[i]<<endl;
        s+=a[h[i]];
    }
    cout<<s<<endl;
    return 0;
}

十六进制转十进制,这道题和上面就又不一样了,不过简单:只要提取出来每个字符,对应成相应的十进制数字,再乘上相应的权重就可,当然,还是map,嗯,出镜率很高,好用
上代码
十六进制转十进制

#include <bits/stdc++.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int main()
{
    map<char,int> a;
    a['0']=0;
    a['1']=1;
    a['2']=2;
    a['3']=3;
    a['4']=4;
    a['5']=5;
    a['6']=6;
    a['7']=7;
    a['8']=8;
    a['9']=9;
    a['A']=10;
    a['B']=11;
    a['C']=12;
    a['D']=13;
    a['E']=14;
    a['F']=15;
    //a={'0':1,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'B':11,'C':12,'D':13,'E':14,'F':15};
    //cout<<a['F']<<endl;
    string str;
    cin>>str;
    char temp;
    long long num=0;
    for(int i=0;i<str.length();i++)
    {
        temp=str[i];
        num+=a[temp]*pow(16,(str.length()-1-i));
    }
    cout<<num<<endl;
    return 0;
}

最后一道,也是这几道题里最复杂的一个十六进制转八进制诶,千万不要觉得都是进制的转换,差别大了去了,不一样不一样
这个呢,是要找一个桥梁----二进制,要先转成二进制,再转成八进制,倒是没有太难的点,就是麻烦一点,不写了,直接看代码好了(我个懒女人)
诶,不对,还是有点想写写的(喔,善变的女人)
数字型字符转int型:char str='1'; int num=str-'0';
这时候的num就是1,(int的1)
int转string型:

				int temp=8;
				stringstream ss;
                ss<<temp;
                str_8+=ss.str();

这时候的str_8就是"8"(string类型的8)
无了,上菜
十六进制转八进制

#include <bits/stdc++.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int main()
{
    string a[16]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
    string b[8]={"000","001","010","011","100","101","110","111"};
    int n;
    cin>>n;
    string num[n];
    string str="";
    string str_new;
    string str_8;
    int temp=0;
    //string str_temp;
    for(int i=0;i<n;i++)
    {
        cin>>num[i];
        //str+=a[num[i]];
    }
    //cout<<str<<endl;
    int j=0;
    for(int i=0;i<n;i++)
    {
        str="";
        str_new="";
        str_8="";
        //str_temp="";
        j=0;
        int number;
        char my_str;
        while(num[i][j]!='\0')
        {
            //cout<<"hello"<<endl;
            //cout<<num[i][j]<<endl;
            if(num[i][j]=='0'||num[i][j]=='1'||num[i][j]=='2'||num[i][j]=='3'||num[i][j]=='4'||num[i][j]=='5'||num[i][j]=='6'||num[i][j]=='7'||num[i][j]=='8'||num[i][j]=='9')
            {
                my_str=num[i][j];
                number=my_str-'0';
                str+=a[number];
            }
                //str+=a[atoi(num[i][j])];
            else if(num[i][j]=='A'||num[i][j]=='a')
                str+=a[10];
            else if(num[i][j]=='B'||num[i][j]=='b')
                str+=a[11];
            else if(num[i][j]=='C'||num[i][j]=='c')
                str+=a[12];
            else if(num[i][j]=='D'||num[i][j]=='d')
                str+=a[13];
            else if(num[i][j]=='E'||num[i][j]=='e')
                str+=a[14];
            else if(num[i][j]=='F'||num[i][j]=='f')
                str+=a[15];
            j++;
            //cout<<str<<endl;

        }
        //cout<<str<<endl;

        if(str.length()%3!=0)
        {
            if((str.length()+1)%3==0)
            {
                str_new='0'+str;
            }
            else if((str.length()+2)%3==0)
            {
                str_new="00"+str;
            }
            //cout<<str_new<<endl;
            //cout<<(str_new[3*2]-'0')*pow(2,2)+(str_new[3*2+1]-'0')*pow(2,1)+(str_new[3*2+2]-'0')*pow(2,0)<<endl;

        }
        else
            str_new=str;
        for(int k=0;k<str_new.length()/3;k++)
            {
                temp=(str_new[3*k]-'0')*pow(2,2)+(str_new[3*k+1]-'0')*pow(2,1)+(str_new[3*k+2]-'0')*pow(2,0);
                //cout<<temp<<endl;
                stringstream ss;
                ss<<temp;
                str_8+=ss.str();
            }
        int q=0;
        while(str_8[q]=='0')
        {
            q++;
        }
        for(int i=q;i<str_8.length();i++)
        {
                cout<<str_8[i];
        }
        cout<<endl;
        //cout<<str_8<<endl;
    }


    return 0;
}

结束,我要继续奋斗在蓝桥的天地了,see you later~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值