2017蓝桥杯B组:取数位(递归,求余和除法)

77 篇文章 12 订阅
19 篇文章 1 订阅

五、题目:取数位

求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));
}

对于题目中的测试数据,应该打印5。
请仔细分析源码,并补充划线部分所缺少的代码。
注意:只提交缺失的代码,不要填写任何已有内容或说明性的文字。


  • 分析思路:
    代码填空还是原方法,读题之后,把需要填空部分注释掉,在编译程序上运行一下,
    看到输出结果要求是第三位能够得到5,要考虑是顺数第三位还是倒数第三位
    在这里插入图片描述在第11行打断点
    数字的长度x恰好等于k
    在这里插入图片描述
    自己可以试试其他数字,例如574看其输出结果 x=574;k=3
    看出填空位置是一个递归
    当出现len长度和k不一致时,明显len要大于k,若len小于k,直接就是对最后一位取余

发现x/10是去掉低位,保留高位;例如:574/10=57
x%10=4是去掉高位,保留低位;例如574%10=4

  • 先用自己的例子测试一下
    代码:
#include<iostream>
using namespace std;

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 f(x/10,k);  //填空
}

int main()
{
	int x = 574;
	printf("%d\n", f(x,2));
}

在这里插入图片描述
发现思路是正确的
然后测试题目所给代码和数据23574

#include<iostream>
using namespace std;

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 f(x/10,k);  //填空
}

int main()
{
	int x = 23574;
	printf("%d\n", f(x,3));
}

在这里插入图片描述
答案:f(x/10,k)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值