2024年第十五届蓝桥杯C/C++大学B组题 A进制

本文分享了作者在蓝桥杯竞赛中的进制转换问题解决过程,包括C++代码实现,如何确保每位数字不超过10,以及对这类问题的经验总结,强调清晰思路和细节的重要性。
摘要由CSDN通过智能技术生成

 

前言:本人大二第一次参加蓝桥杯,在完成了四道大题后荣获省四的“好成绩”,当天高兴得没睡着觉……于是乎现在开始了复盘工作,主要用于学习和分享经验,争取下一次能获得更好的成绩()

一、题目分析

本题目是有关于进制转换类的题目,则可以联想到进制转换的一般公式,博主本人在比赛时用的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

三、经验总结

进制转换类型的题目是比较简单的,也是非常基础的一种题目,即使没有思路也可以拿纸和笔硬算出来 ,还是需要多加练习的。在做题之前一定要有一个清晰的思路,不能死缠烂打在某一个自己比较认同的点,在完成代码之后还要注意些细节的地方,这样写出来的代码就非常的漂亮了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值