现在的位置: 首页 > 综合 > 正文

杭电1058

2013年10月29日 ⁄ 综合 ⁄ 共 1198字 ⁄ 字号 评论关闭

看到本题的题目就应该知道,这个题的时间应该是线程的,下面说说思路。

本题所要求的就是素数2 ,3, 5, 7这四个数的倍数,而且还不能数别的素数的倍数,如11,13 等,那么我们就可以想到将10以后的素数和他们的倍数排除掉,但是这样做太耗时,空间存储要求很大,所以这种想法是不可能AC的。下面换一种思路,既然他求得是2,3,5,7这几个数和他们的倍数(还有1),那么去我们就可以将他们的倍数全都表达出来,你可以这么想,既然他们都是2,3,5,7这几个数的倍数,那么自然这所有的数内部之间必然也是倍数的关系,比如24 ,6而且他们的商也一定是这些数里面的,说这个主要是想表达在表示倍数时,用这些数乘以2,3,5,7就可以了。下面结合代码讲讲“:

#include<stdio.h>
#include<string.h>
int  min(int a,int b,int c,int d)
{   int x=a<b?a:b;
        x=x<c?x:c;
        x=x<d?x:d;
        return x;
}
int f[5845];
int main()
{   
    int i,a,b,c,d;
    int n;
    a=b=c=d=1;
    memset(f,0,sizeof(f));
    f[1]=1;
    for(i=2;i<=5843;i++)
    {
        f[i]=min(f[a]*2,f[b]*3,f[c]*5,f[d]*7);(1)
        if(f[i]==f[a]*2)(2)
            a++;
       if(f[i]==f[b]*3)(2)
            b++;
        if(f[i]==f[c]*5)(2)
            c++;
        if(f[i]==f[d]*7)(2)
            d++;

    }

       

       while((scanf("%d",&n)!=EOF)&&n)
       {   if((n%100==11)||(n%100==12)||(n%100==13))
               printf("The %dth humble number is %d.\n",n,f[n]);
              else if(n%10==1)
                printf("The %dst humble number is %d.\n",n,f[n]);
              else if(n%10==2)
                  printf("The %dnd humble number is %d.\n",n,f[n]);
              else if(n%10==3)
                    printf("The %drd humble number is %d.\n",n,f[n]);
              else   printf("The %dth humble number is %d.\n",n,f[n]);
       }


    return 0;

}
上面数字标(1)的地方就是我说的方法,就是找到这些数的倍数,提前就判断大小,注意标(2)的地方这里不是if,,,,else,,,比如f(a)=3,f(b)=2,这样两个相等,如果你只让一个增加,比如a,那么这样的话下一次就是f(b)*3最小啦,也就是这个数会被记录两次。最后就是注意一下输出,这就要考察英语啦,如果他只给出两个例子,你能不能AC呢??所以就算是看在英语的面上这题也要做。

抱歉!评论已关闭.