题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。
求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));
}
Java
import java.util.*;
public class Main
{
static int len(int x){
if(x<10) return 1;
return len(x/10)+1;
}
// 取x的第k位数字
static int f(int x, int k){
if(len(x)-k==0) return x%10;
return ______________________; //填空
}
public static void main(String[] args)
{
int x = 23513;
//System.out.println(len(x));
System.out.println(f(x,3));
System.out.println(f(893275,2));
}
}
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路:
这里选择 Java 作为解答语言,首先,可以看到,这里有一个参照的函数 len(),对于求解数字长度的函数,若该数字的值大于 10,则采用递归的方法进行求解,首先将该数字的最低一位去掉并将递归调用的结果加上 1,即加上去掉的这一位。可以看到我们需要填空的函数中,应该也是采用类似的方法进行求解数的第 k 位数的值,首先可以看到该函数中的递归基例是数的长度刚好等于所求的第 k 位数的 k 值,这个时候只需要返回最后一位即可,也就是直接对 10 取余,可以看到这里需要一个递归函数,也就是当数的长度大于欲求位数的时候,我们需要进行递归,递归的第一个参数是 x / 10,第二个参数是 k,因为这样就做到了数越来越短但是 k 一直不变的效果,直到递归到 len(x) 的值等于 k 的时候就直接返回 x % 10 的值即可;这里不考虑数的长度的值小于 k 的情况,因为这是一种错误的假设,本身就不成立。需要注意的是,这里粘贴代码进行提交的时候,格式不可以改动!否则即使填空答案正确,检测也不通过。该算法的 Java 代码实现如下:
import java.util.*;
public class Main
{
static int len(int x){
if(x<10) return 1;
return len(x/10)+1;
}
// 取x的第k位数字
static int f(int x, int k){
if(len(x)-k==0) return x%10;
return f(x / 10, k); //填空
}
public static void main(String[] args)
{
int x = 23513;
//System.out.println(len(x));
System.out.println(f(x,3));
System.out.println(f(893275,2));
}
}