【题目】
集合的前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; }