pku1338 ugly number 之绝对超时法 我是这样想的仅供参考

#include<stdio.h>
#include<math.h>
#define m 5000000//定义太大机器跑不起来
bool b[m];
int main()
{
   int i,j,n,num=0,a[1505]={0,1,2,3,4,5,6};
   bool *p;
   for(p=b;p<(b+m);p++)*p=1;
   int end=m/2;
   for(i=7;i<=end;i++)//筛选 符合要求的数
   {
        if(i%2==0||i%3==0||i%5==0);
        else b[i]=0;
        if(b[i]==0)
        for(j=i;j<m;j+=i)
        {
             b[j]=0;              
        }              
   }
  
   printf("%d/n",b[m-1]);  //观察是否运行到此步  、、可不要
   for(i=1;i<=50;i++) printf("%d  %d/n",i,b[i]);
   while(scanf("%d",&n)&&n)
   {
        num=0;
        for(i=1;;i++)
          {
                     if(b[i])num++;
                     if(num==n)break;
          }
        printf("%d/n",i);                  
   }
}

//之快速方法     我参考了别人的代码

#include<stdio.h>
int main()
{
   int i,n,num1,num2,num3,a,b,c,min1;
   int ugly[1505]={0,1};
   num1=num2=num3=1;
   ugly[1]=1;
   for(i=2;i<=1500;i++)
   {
       a=2*ugly[num1];b=3*ugly[num2];c=5*ugly[num3];
      
       ugly[i]=(min1=a<b? a:b)<c? min1:c;
       if(ugly[i]==a)num1++;
       if(ugly[i]==b)num2++;
       if(ugly[i]==c)num3++;                
   }
   //for(i=1;i<=50;i++)printf("%d ",ugly[i]);
   while(scanf("%d",&n)&&n)
   {
      printf("%d/n",ugly[n]);                    
   }
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值