一【题目描述】
标题:取数位
求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。
请仔细分析源码,并补充划线部分所缺少的代码。
注意:只提交缺失的代码,不要填写任何已有内容或说明性的文字。
二【解题思路】
这个是程序的填空题,所以我们需要从程序的第一行开始仔细的看,程序的目的是求一个整数的第K位数字是多少,那么就想到在练习中,如果让我们求一个整数的第k位的话,我们都是使用取余除法等操作得到第k为数组。
从main函数开始,首先给了一个整数,带入函数里面,目的是求出这个整数的第3位是多少,显然一看就是5。然后我们回到上面的函数,第一个len函数,给了一个整型参数,里面如果小于10就返回1,如果大于等于10就返回len(x/10)+1的操作,这个是一个递归,如果没有明白是什么意思,我们可以带几个数字进去判断功能。
首先是len(3),返回1;然后带入len(13),返回2;然后带入len(103),返回3。所以这里我们可以猜测,这个函数的功能是返回整数的位数。然后我们来看第二个函数,有两个参数,一个就是整数,另一个就是我们要知道的第k位数。首先判断,如果是取这个整数的最后一位,直接与10取模即可。然后就是填空的部分.....
我们都知道,要得到一个数的某位上的数字,都是进行/10和%10的操作,具体来说就是我想要得到某个位上的数字,我就一直进行除以10的操作,将我想要的这个数字放到最后一位,然后进行取模操作。比如,1000352,我想要数字3,那么我就开始进行除以10的操作,得到100035,然后10003,把3放到最后一位之后,我只需要对这个数字取模即可,最后我就得到了数字3。观察一下不难发现,题目要做的也是这个,将需要的数字放到最后,然后取模。至于条件,因为我是从高位顺序的查找,所以查找的位数就是我想要找的第几位,所以当位数只有k位了,那么就是我要的数字到达了末尾。所以,我们这里就填空
f(x/10,k)
三【解题步骤】
#include<iostream>
#include<math.h>
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("%ld\n", f(x,3));
return 0;
}
答案:f(x/10,k);
四【总结】
对于取第几位数字的算法,其实有很多方式,除了上面的利用递归,我们也可以直接利用公式,比如:x%(int)pow(10,len(x)-k+1)/(int)pow(10,len(x)-k);看,当然还有其它的,只是要求不一样,追求不一样吧。如果有误,请指出,谢谢。