半数单集问题

问题描述:给定一个自然数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));


}


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值