已知一个整数集合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
注意:题目提供前置代码,只需要提交需要补全的函数即可。
预设代码
前置代码
- /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
- #include <stdio.h>
- int main()
- { int k,x,s,isElement(int ,int);
- scanf("%d %d", &k,&x);
- s = isElement(k,x);
- if(s){
- printf("YES\n");
- }
- else{
- printf("NO\n");
- }
- return 0;
- }
- /* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#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;两个条件来限定递归边界