第八届蓝桥杯个人赛省赛(软件类)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。

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

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

二【解题思路】

     这个是程序的填空题,所以我们需要从程序的第一行开始仔细的看,程序的目的是求一个整数的第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);看,当然还有其它的,只是要求不一样,追求不一样吧。如果有误,请指出,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105245435
今日推荐