前言
蓝桥杯B组2017年省赛代码填空题(C++)
一、题目描述
求1个整数的第k位数字有很多种方法。 以下的方法就是一种。
请仔细分析源码,填写划线部分缺少的内容。
源代码
C
#include <stdio.h>
// 求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));
printf("%d\n", f(893275,2));
}
二、思路
位数一般是从左向右,比如x=23574,第一位就是2,第二位就是3,以此类推。如果是个十位,那么就是从右向左,个位是4,十位是7,以此类推。本题中所指的位数是从右向左。那么观察代码中的f函数,返回的条件是当x的长度等于k的值,返回x的个位结果。那么也就是说只有把x的位数缩小到和k一样大小时,返回个位数的结果才正确,那么横线处就很好填了,每次递归的参数是(x/10,k),直到符合条件。
三、程序代码
#include <stdio.h>
// 求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 f(x/10,k); //填空
}
int main()
{
int x = 23574;
printf("%d\n", f(x,3));
printf("%d\n", f(893275,2));
}