Problem 1207 半数集问题 from http://acm.fzu.edu.cn/problem.php?pid=1207

本文介绍了一个解决半数集问题的算法,通过递归计算每个自然数对应的半数集中元素数量,最终输出给定自然数对应的半数集大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Problem 1207 半数集问题

Accept: 1200    Submit: 3595
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。

(1)n∈set(n); (2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3)按此规则进行处理,直到不能再添加自然数为止。

例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6个元素。

注意 半数集不是多重集。集合中已经有的元素不再添加到集合中。

编程任务

对于给定的自然数n,编程计算半数集set(n)中的元素个数。

 Input

本题有多组输入数据,你必须处理到EOF为止。
每组数据只有1行,给出整数n。(0<n<201)

 Output

对于每组数据,输出只有1行,给出半数集set(n)中的元素个数。

 Sample Input

6

 Sample Output

6


关键是处理重复元素,考虑新增的数小于等于100,100是不会有重复的。然后就是两位数有可能与一位数的产生重复。如48 100, 4 8 100。两位数产生的包含了一位数的,所以去掉的元素个数为halfSet(4).

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<memory.h>
using namespace std;
int a[202] = {0};
int halfSet(int n){

    if(a[n] == 0){
        int sum = 1;
        for(int i=1;i<=n/2;++i){
           sum += halfSet(i);
           if(i>9 && ((i/10)<=(i%10/2)))
                sum -= halfSet(i/10);
        }
        a[n] = sum;

    }

    return a[n];
}
int main(){
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);

    int n;
    while(cin>>n){
        cout<<halfSet(n)<<endl;
    }
    //fclose(stdin);
    //fclose(stdout);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值