0
点赞
收藏
分享

微信扫一扫

第八届蓝桥杯C++B组:取数位


求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。

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

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

 答案:

return f(x / 10 , k);

思路:

1,在f函数的if判断那里打断点,然后debug,发现程序只判断了一次数位长度是否等于k,就退出了循环(把测试数据改为574,发现输出的是4,因此题目所求的第三位,就是正着数的第三个);

2,如果要多次重复判断,就必须要重复调用f函数,因此想到了递归(要么K增大,要么len减少,但是k不能增大了【越界】);

3,由于调用的是len函数,不断的判断x的长度,由此判断x会进行变化,;

4,而且观察f函数返回的是x取10的余数(就是取个位),如果要想取到第k位的数(就必须使得第K位为个位),因此就只有对x进行除以10的操作,测试后,发现正确!

参考代码:

#include <cstdio>

// 求x用10进制表示时的数位长度
int len(int x){
if(x < 10)
return 1;
return len(x / 10) + 1;
}

// 取x的第k位数字
int f(int x, int k){
int temp = len(x);
if(len(x) - k == 0)
return x % 10;
//return _____________________; //填空
return f(x / 10 , k);//不是求最后一位,则去掉最后一位
}

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



举报

相关推荐

0 条评论