C中丑陋数字的逻辑

时间:2014-11-23 04:53:06

标签: c logic

here开始,我正在尝试开发自己的逻辑来生成一系列丑陋的数字。但每次都打印出所有数字。

我确定该数字的前3个素数因子是2,3和5,并将它们放入计数变量中,以确定数字x的素数因子的总数。

如果计数大于3,则数字并不难看。

以下是代码:

/* To generate a sequence of Ugly numbers 
   Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence
   1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …
   shows the first 11 ugly numbers. By convention, 1 is included.
*/

#include<stdio.h>
#include<math.h>

int isprime(int x)
{
    int i;
    for(i=2;i<=sqrt(x);i++)
        if(x%i==0)
            return 0;
    return 1;
}

int isUgly(int x)
{
    int count=0; //To maintain the count of the prime factors. If count > 3, then the number is not ugly
    int i;
    for(i=2;i<=sqrt(x);i++)
    {
        if(isprime(i) && x%i==0)
        {
            count++;
            if(count > 3)
                return 0; // Not ugly
        }   
    }
    return 1;
}

int main(void)
{
    int i,n=10;
    printf("\n The ugly numbers upto %d are : 1 ",n);
    for(i=2;i<=n;i++)
    {
        if(isUgly(i))
            printf(" %d ",i);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

这里的isUgly()版似乎对我有用。

int isUgly(int x)
{
    int i;
    static int factors[] = {2, 3, 5};

    // Boundary case...
    // If the input is 2, 3, or 5, it is an ugly number.
    for ( i = 0; i < 3; ++i )
    {
       if ( factors[i] == x )
       {
          return 1;
       }
    }

    if ( isprime(x) )
    {
       // The input is not 2, 3, or 5 but it is a prime number.
       // It is not an ugly number.
       return 0;
    }

    // The input is not a prime number.
    // If it is divided by 2, 3, or 5, call the function recursively.
    for ( i = 0; i < 3; ++i )
    {
       if ( x%factors[i] == 0 )
       {
          return isUgly(x/factors[i]);
       }
    }

    // If the input not a prime number and it is not divided by
    // 2, 3, or 5, then it is not an ugly number.
    return 0;
}

答案 1 :(得分:0)

试试这个:

#include<stdio.h>

long int n, count=1;

void check(long int i)
{
    if(i==1){
        ++count;
        return;
    }
    else if(i%2==0)
        check(i/2);

    else if(i%3==0)
        check(i/3);

    else if(i%5==0)
        check(i/5);
    else
        return;
}

void main(){

    for(n=1;;n++){

        check(n);

        if(count==1000){
            printf("%ldth no is %ld\n",count,n);
            break;
        }
    }
}