• 集合的前N个元素


    【题目】

    集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
        (1)数1属于M;
        (2)如果X属于M,则Y=2*x+1和Z=3*x+1也属于M;
        (3)此外再没有别的数属于M。

    【分析】

           可以用两个队列a和b来存放新产生的数,然后通过比较大小决定是否输出,具体方法如下:
           (1)令fa和fb分别为队列a和队列b的头指针,它们的尾指针分别为ra和rb。初始时,X=1,fa=fb=ra=rb=1;                              
          (2)将2*x+1和3*x+1分别放入队列a和队列b的队尾,尾指针加1。                  即:a[r]←2*x+1,b[r]←3*x+1,r←r+1;
          (3)将队列a和队列b的头结点进行比较,可能有三种情况:
            (A)a[ha]>b[hb]      (B)a[ha]=b[hb]         (C)a[ha]<b[hb]
          将比较的小者取出送入X,取出数的队列的头指针相应加1。
          (4)重复(2),(3)直至取出第N项为止。

    【代码】

    #include<cstdio>
    using namespace std;
    
    const int N = 20002;
    int a[N],b[N]; 
    //a是2x+1,b是3x+1
    int n,fa=1,fb=1,ra=0,rb=0,x=1,h=1;
    //x为最开始的一个数,h做统计
    
    int main() {
        scanf("%d",n);
        while(h<=n) {
            printf("N=%d",x);
            a[++ra]=x*2+1;
            b[++rb]=x*3+1;
            if(a[fa]<b[fb]) x=a[fa++];
            else if(a[fa]>b[fb]) x=b[fb++];
            else x=a[fa++],fb++;
            h++;
        }
        return 0;
    }
    View Code

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    Lambda表达式
    多态之美
    集合那点事
    程序员艺术家
    MySQL:如何导入导出数据表和如何清空有外建关联的数据表
    Ubuntu修改桌面为Desktop
    shutil.rmtree()
    SCP命令
    kickstart
    数据哈希加盐
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6635399.html
Copyright © 2020-2023  润新知