早教吧 育儿知识 作业答案 考试题库 百科 知识分享

C语言半数集问题C++解给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。(1)n∈set(n);(2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(3)按

题目详情
C语言半数集问题C++解
给定一个自然数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将计算结果输出到文件output.txt中。输出文件只有1行,给出半数集 set(n)中元素个数。
输入文件示例 输出文件示例
input.txt output.txt
6 6
▼优质解答
答案和解析

半数集set(n)元素个数f(n)=1+f(1)+f(2)+...+f(floor(n/2)). 用递推法求解。

#include<stdio.h>
#include<stdlib.h>
int main(){
    int n;
    int i,j,s;
    int buf[106];
    char *in="input.txt",*out="output.txt";
    FILE *ip,*op;
    
    if((ip=fopen(in,"r"))==NULL)return 1;
    if((op=fopen(out,"w"))==NULL)return 2;
    fscanf(ip,"%d",&n);
    fclose(ip);
    buf[1]=1;
    buf[2]=2;
    buf[3]=2;
    
    for(i=4;i*2<=n;i++){
      s=1;
      for(j=1;j<=i/2;j++){
        s+=buf[j];
      }
      buf[i]=s;
    }
    s=1;
    for(j=1;j<=n/2;j++){
      s+=buf[j];
    }
    fprintf(op,"%d",s);
    fclose(op);
/*    system("pause");*/
    return 0;
}
看了 C语言半数集问题C++解给定...的网友还看了以下: