第八届蓝桥杯【省赛试题5】取数位

本文介绍了一种使用递归方法求解整数第k位数字的算法实现,通过逐步去除最低位数字直至达到所需位置,最终获取指定位上的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

求1个整数的第k位数字有很多种方法。
以下的方法就是一种。

// 求x用10进制表示时的数位长度 
int len(int x){
	if(x<10) return 1;
	return len(x/10)+1;
}
	
// 取x的第k位数字
int f(int x, int k){
	if(len(x)-k==0) return x%10;
	return _____________________;  //填空
}
	
int main()
{
	int x = 23574;
	printf("%d\n", f(x,3));
	return 0;
}

对于题目中的测试数据,应该打印5。

请仔细分析源码,并补充划线部分所缺少的代码。

注意:只提交缺失的代码,不要填写任何已有内容或说明性的文字。


题目答案:

f(x/10,k)

题目思路:

题目较为简单,要求出数字x的第k位数是多少(从左往右)。f(x,k)为求x的第k位,我们从递归出口可以看出,当x的长度是k的时候,我们返回x的最后一位,那么递归的范围就是x的长度不等于k,那么,我们就需要减少x的长度,通过x/10可以去除最右边位的数字。因为要其的第k位是从左往右数的,所以当x减少位数的时候,对k是没有任何影响的。

### 第七届蓝桥杯单片机试题分析 #### LED 显示控制 在第七届蓝桥杯中,LED显示是一个重要的考点。通过合理的编程逻辑可以实现对多个LED的精确控制。例如,在某些情况下可能需要根据特定条件点亮或熄灭指定编号的LED。 ```c void led_control(int num, int state){ if(state == ON){ GPIO_SetBits(GPIOA, (1 << num)); // 假设使用STM32系列MCU }else{ GPIO_ResetBits(GPIOA, (1 << num)); } } ``` 此函数用于设置某个GPIO引脚的状态来控制对应的LED亮起或是关闭[^1]。 #### 按键检测机制 对于按键部分的设计,则涉及到如何有效地读外部输入信号并作出响应。通常会采用轮询方式定期扫描各个按键状态变化情况;也可以利用中断服务程序处理更复杂的交互需求。 ```c int key_scan(void){ static unsigned char last_key = NO_KEY; unsigned char current_key; /* 获当前按下的键 */ current_key = get_current_pressed_key(); /* 判断是否有新的按下事件发生 */ if(current_key != last_key && current_key != NO_KEY){ last_key = current_key; return current_key; } return NO_KEY; } ``` 上述代码片段展示了简单的按键扫描流程,其中`get_current_pressed_key()`负责获实际硬件上的按键值。 #### 数码管驱动方法 数码管作为常见的字符型显示器之一,在竞里经常被用来展示数值信息等内容。为了提高刷新效率以及减少视觉闪烁现象,一般采动态扫描的方式逐位更新数据至各段选线上。 ```c void display_digit(uint8_t digit[], uint8_t position, uint8_t value){ segment_data[position] = number_to_segment[value]; } void refresh_display(){ for(int i=0;i<NUM_DIGITS;++i){ select_digit(i); output_segments(segment_data[i]); delay_us(SCAN_DELAY); } } ``` 这里定义了两个辅助性的子过程:一个是将十进制数转换成适合数码管表示形式的数据序列;另一个则是按照一定周期循环调用以维持稳定画面效果。 #### PWM 调光技术应用 PWM(脉宽调制)是调节输出功率的有效手段,尤其适用于灯光亮度调整方面。尽管该知识点相对抽象难以直观理解,但在具体实践中只需掌握基本原理即可灵活运用到项目当中去。 ```c TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_OCInitStructDef TIM_OCInitStruct; /* 初始化定时器配置结构体 */ TIM_StructInit(&TIM_InitStruct); /* 配置自动重装载寄存器初值 */ TIM_InitStruct.TIM_Period = ARR_VALUE; /* ...其他必要初始化操作 */ /* 设置比较匹配通道模式为PWM1 */ TIM_OCStructInit(&TIM_OCInitStruct); TIM_OCInitStruct.TIM_OCMode = TIM_OCMODE_PWM1; /* 设定占空比DutyCycle */ TIM_OCInitStruct.TIM_Pulse = DUTY_CYCLE * ARR_VALUE / 100; /* 应用以上设定 */ TIM_OC1Init(TIMx,&TIM_OCInitStruct); TIM_Cmd(TIMx, ENABLE); ``` 这段C语言源码实现了基于定时计数器外设产生的PWM波形输出功能,能够方便地改变连接负载的工作强度。 #### 温度传感器 DS18B20 接口通信协议 最后提到的是温度测量元件DS18B20的应用实例。这类器件遵循One-Wire总线标准进行串行通讯,并且具备较高的精度特性。下面给出一段简化版的一次性读温算法: ```c float read_temperature(void){ float temperature_celsius; uint8_t raw_data[9]; OneWireReset(); SendCommand(SKIP_ROM_CMD); SendCommand(CONVERT_T_CMD); while(IsBusy()); OneWireReset(); SendCommand(SKIP_ROM_CMD); SendCommand(READ_SCRATCHPAD_CMD); ReadBytes(raw_data,sizeof(raw_data)); temperature_celsius=(raw_data[1]<<8 | raw_data[0]) * 0.0625f; return temperature_celsius; } ``` 整个过程中包含了发送命令、等待完成标志清除还有最终解析二进制编码得到摄氏度量纲的结果等几个主要环节。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值