算法 — 取位数

题目描述

本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(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));
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值