《leetCode》:Ugly Number II

题目

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note that 1 is typically treated as an ugly number.

题目大意:求第n个丑数,其中1为第一个丑数。丑数的定义为:只含有2、3、5因子其中一个或几个的数就是丑数。

思路

丑数:利用递归来求解即可
下一个丑数一定是由前面的丑数乘以 2/3/5大于当前丑数且最小的那个。
此题比较简单,这是第三次遇到这个题了。

/*

2015111319:18:39 
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//函数的功能:返回三个数中的最小值 
int my_min(int a,int b,int c){
    if(a<=b&&a<=c){
        return a;
    }
    else if(b<=c){
        return b;
    }
    else{
        return c;
    }
}
int nthUglyNumber(int n) {
    if(n<1){
        return 0;
    }    
    //开辟n个空间来存储结果
    int *result=(int *)malloc(n*sizeof(int));
    if(result==NULL)
        exit(EXIT_FAILURE);
    memset(result,0,n*sizeof(int));
    result[0]=1;
    int cur=1;//用来指向当前result数组中即将保存 下一个丑数的位置 
    //三个指针,分别指向 下一个丑数的候选值的指针。 
    int *p2=result;
    int *p3=result;
    int *p5=result;
    while(n>1){
        int min=my_min((*p2)*2,(*p3)*3,(*p5)*5);

        result[cur]=min;
        cur++;
        while((*p2)*2<=min){
            p2++;
        }
        while((*p3)*3<=min){
            p3++;
        }
        while((*p5)*5<=min){
            p5++;
        }
        n--;
    }
    return result[cur-1]; 

}

int main(void){
    int k;
    while(scanf("%d",&k)!=EOF){
        printf("%d\n",nthUglyNumber(k));
    }
}

AC结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值