集合的前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

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

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

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6635399.html