半数集问题

算法实现题 2-5 半数集问题

问题描述:
给定一个自然数 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.txt 的文本文件提供。
每个文件只有 1 行,给出整数 n。(0<n<1000)
结果输出:
程序运行结束时,将计算结果输出到文件 output.txt 中。输出文件只有 1 行,给出半
数集 set(n)中的元素个数。
输入文件示例 输出文件示例
input.txt output.txt
6 6
普通问题版:

#include<bits/stdc++.h>
using namespace std;
//Set函数作用计算n有几个半数集,不要当递归用就行了 
int Set(int n)
{
    int i,sum = 1;

    for(i=1;i<=n/2;i++)//<=
        sum += Set(i);
    return sum;
}
int main()
{
    int n;
    scanf("%d",&n);
        printf("%d\n",Set(n));
    return 0;
}
 

文件读取版:
💕以下代码放到根目录下运行
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int n ;
//Set函数作用计算n有几个半数集 
int Set(int n)
{
	int sum=1; 
	if(n==0)
	return 1;
	for(int i=1;i<=n/2;i++)
		sum+=Set(i);
	
	return sum;
}
int main()
{
	int ans;
	int cnt=0;
   string testadd = "./test/set.in", answeradd = "./answer/set.out";
    FILE *test = fopen(&testadd[0], "r"), *answer = fopen(&answeradd[0], "r");
  while(fscanf(test,"%d",&n)!=EOF)
  {
  	int res=Set(n);
  	cnt++;
  	fscanf(answer,"%d",&ans);
  	if(res!=ans)
	  printf("第%d个测试未通过\n",cnt);
	  else
	  printf("第%d个测试通过\n",cnt); 
  }
  
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值