问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:
(1)set(n)中包含n;
(2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3)按此规则进行处理,直至不能添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。
编程任务:对于给定的自然数n,编程计算半数集set(n)中元素的个数。
注意:该半数集不是多重集,即已有的元素不能再添加到集合中去。
解题思路:因为半数集不是多重集,所以集合中已有的元素不能添加到集合当中去。
本题主要是排除重复问题。因为0<n<201所以加上去的数一定<=100,显然100
不会引起重复的问题,所以只需考虑两位数的情况
算法实现:递归分治实现 1.n是两位数 2.n/10<=p%10
代码实现:
/**
* @author Administrator
* 半数单集
*
*/
public class HalfSingleSet {
int[] a =new int [1000];
int Single(int n){
int s;
if(n==1){
return 1;
}
else{
if(a[n]==0){
s=1;
for(int i=1;i<=n/2;i++){
s+=Single(i);
if(i>10&&(i/10<=i%10)){
s-=Single(i/10);
}
}
a[n]=s;
}
return a[n];
}
}
/**
* @param args
*/
public static void main(String[] args) {
HalfSingleSet hs=new HalfSingleSet();
System.out.println("请输入要验证的数字la");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
System.out.println(hs.Single(n));
}
}