百丽宫2024春真题 编程题三 递归题解

已知一个整数集合M的生成方式为: (1) 已知 k 是集合 M 的元素; (2) 如果 x 是 M 的元素,那么, 2x+1 和 3x+1 都是 M 的元素; (3) 除了上述二种情况外,没有别的数能够成为 M 的一个元素。

给定 k <= x,请编写递归函数 int isElement(int k, int x) 判断 x 是否是 M 的元素。其中 k 和 x 均为非负整数,x 不大于 100000, 如果x是集合中元素,则输出YES,否则,输出 NO。

输入描述:

一行,输入整数 k 和 x, 空格间隔。

输出描述:

如果x是集合中元素,则输出YES,否则,输出 NO。

 

样例输入:1 4

样例输出:YES

注意:题目提供前置代码,只需要提交需要补全的函数即可。

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3.   
  4. int main()  
  5. {  int k,x,s,isElement(int ,int);  
  6.    scanf("%d %d", &k,&x);  
  7.    s = isElement(k,x);  
  8.    if(s){  
  9.         printf("YES\n");  
  10.    }  
  11.    else{  
  12.        printf("NO\n");  
  13.    }  
  14.    return 0;  
  15. }  
  16.   
  17. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */  
测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 1 4↵
以文本方式显示
  1. YES↵
1秒64M0
#include<stdio.h>
int isElement(int k, int x){
	if(x==k)return 1;
	if(x<k) return isElement(k,x*2+1)+isElement(k,x*3+1);//考虑比已知量要小的情况
	if((x-1)%2!=0&&(x-1)%3!=0) return 0;
	else if((x-1)%2!=0&&(x-1)%3==0){//节省步骤,因为是整数集,中途只要不能整除就不满足
		return isElement(k,(x-1)/3);
	}
	else if((x-1)%2==0&&(x-1)%3!=0){
		return isElement(k,(x-1)/2);
	}
	else{//一直递归到最后如果两种途径有一种是满足在这个数集中那么加和不为零
		return isElement(k,(x-1)/3)+isElement(k,(x-1)/2);
	}
} 

楼主根据前面提交未过的情况枉自推测隐藏案例二应当是x<k,所以不能把这一语句作为边界条件,而是通过1.判断x在变化过程中是否可以保持整数;2.最后能不能逆推回到k;两个条件来限定递归边界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值