读书人

一类计算有关问题小结pojamp;hoj Set Def

发布时间: 2012-10-15 09:45:25 作者: rapoo

一类计算问题小结poj&hoj Set Definition ,Humble Numbers ,Ugly Numbers 因子构造法

/*这类问题都是给一些只能由某些特定因子乘积组成的数,然后求第n个数的大小。做法就是每次用所给的条件来构造因子,预处理出前N项的值,复杂度O(N),查询复杂度O(1).*/Set Definition.code#include <stdio.h>#include <iostream>using namespace std;int a[10000000];int main(){    a[1]=1;    int n1=1,n2=1;    for(int i=2;i<=10000000;i++)    {        a[i]=min(2*a[n1]+1,3*a[n2]+1);        if(a[i]==2*a[n1]+1) n1++;        if(a[i]==3*a[n2]+1) n2++;    }    int x;    while(scanf("%d",&x)==1)    {        printf("%d\n",a[x]);    }    return 0;}Humble Numbers.code#include <stdio.h>#include <iostream>using namespace std;int a[6000];int main(){    a[1]=1;    int n2=1,n3=1,n5=1,n7=1;    for(int i=2; i<=5842; i++)    {        a[i]=min(min(a[n2]*2,a[n3]*3),min(a[n5]*5,a[n7]*7));        if(a[i]==a[n2]*2) n2++;        if(a[i]==a[n3]*3) n3++;        if(a[i]==a[n5]*5) n5++;        if(a[i]==a[n7]*7) n7++;    }    int n;    while(scanf("%d",&n)==1&&n)    {        if(n%10==1)        {            if(n%100!=11) printf("The %dst humble number is %d.\n",n,a[n]);            else printf("The %dth humble number is %d.\n",n,a[n]);        }        else if(n%10==2)        {            if(n%100!=12) printf("The %dnd humble number is %d.\n",n,a[n]);            else printf("The %dth humble number is %d.\n",n,a[n]);        }        else if(n%10==3)        {            if(n%100!=13) printf("The %drd humble number is %d.\n",n,a[n]);            else printf("The %dth humble number is %d.\n",n,a[n]);        }        else printf("The %dth humble number is %d.\n",n,a[n]);    }    return 0;}Ugly Number.code#include <iostream>using namespace std;int main(){    int number[1505];    int judge[3];    int i,j;    int n;    i=0;    number[0]=1;    while(i<=1500)    {    for( j=0;j<=i,number[j]*2<=number[i];j++);        judge[0]=number[j]*2;    for( j=0;j<=i,number[j]*3<=number[i];j++);        judge[1]=number[j]*3;    for( j=0;j<=i,number[j]*5<=number[i];j++);        judge[2]=number[j]*5;    number[i+1]=min(judge[0],min(judge[1],judge[2]));    i++;   }        cout <<"The 1500'th ugly number is " << number[1499] << "." << endl;    return 0;}


读书人网 >编程

热点推荐