前言:本人大二第一次参加蓝桥杯,在完成了四道大题后荣获省四的“好成绩”,当天高兴得没睡着觉……于是乎现在开始了复盘工作,主要用于学习和分享经验,争取下一次能获得更好的成绩()
一、题目分析
本题目是有关于进制转换类的题目,则可以联想到进制转换的一般公式,博主本人在比赛时用的C++语言,十进制转换为任意进制p的代码如下:
string ten_to_p(int nums,int p)
{
string res;
while(nums)
{
int t =nums%p;
if(t<10)res.push_back(t+'0');
else res.push_back(t-10+'^');
nums/=p;
}
reverse(res.begin(),res.end());
return res;
}
当事人当时没有回忆起来,在挣扎了一个小时后惨被拿下
十进制转化为其他进制的方法大概就是除商求余后,将数字反向串起来,具体的原理牵扯到数码、基数和数位这三者,详情可以参考其他大牛的文章,这里就不做过多赘述。在本题中,题目要求转换进制后每一位上都是数字,没有字母,而最小的字母是'A',其值代表10。换而言之,即转制后每一位上的数字都满足“当前位置上的数值 <10 ”这个条件。稍作思考,我们可以想到本题需要对数位的值进行操作,则需要对上方的进制转换代码进行改编,只留下进制转换的内容。同时考虑到要保证转制后数位上的值都符合题目要求,我们可以用一个循环来剔除不正确的答案。需要注意的是,本题里8100178706957568绝对不是靠一个int就能够存储的量,所以在处理该数据时,我们最好选用long long型变量进行存储。
二、代码实现
代码如下
#include<iostream>
using namespace std;
int jinzhi_p(long long nums)//定义进制函数
{
int t;//定义位值变量
long long num;//定义一个参照量
int p=12;//初始化进制p
num=nums;
while(num)//只有当p与题目所要求的进制相等时,num才有机会等于0,从而退出循环
{
t=num%p;
num/=p;
if(t>=10)//当某一位置上的值不满足题目要求时重置循环
{
num=nums;
p++;
}
}
return p;//结果返回进制p的值
}
int main()
{
printf("%d",jinzhi_p(8100178706957568));//调用函数实现功能
return 0;
}
输出结果
32
三、经验总结
进制转换类型的题目是比较简单的,也是非常基础的一种题目,即使没有思路也可以拿纸和笔硬算出来 ,还是需要多加练习的。在做题之前一定要有一个清晰的思路,不能死缠烂打在某一个自己比较认同的点,在完成代码之后还要注意些细节的地方,这样写出来的代码就非常的漂亮了。