最近在刷蓝桥杯的题,没有时间一道题一篇博客的整理了,就跳着重点写一写吧,也加深一下自己的印象
特殊回文数,这道题就是一个简单的回文数题目,他要的是所有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~