算法实现题 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);
}
}
1052

被折叠的 条评论
为什么被折叠?



