【问题标题】:C program - Left truncatable prime numbersC程序 - 左截断素数
【发布时间】:2021-02-03 17:47:02
【问题描述】:

我编写了一个 c 程序来检查一个数字是否是可截断的素数。但它不起作用。 num_digit 用于计算位数,prime_check 用于检查一个数是否为素数。我对C不太了解,我是初学者。

#include<stdio.h>
#include<math.h>
// to check left truncated prime numbers
int main()
{
    int num,flag=0;
    printf("enter a number\n");
    scanf("%d", &num);
    while (num>0)
    {
        if (prime_check(num)==1) // 1 = true
            {
                int y=num_digit(num);
                num = num-((num/pow(10,(y-1)))*pow(10,(y-1)));
            }
        else
            {
                flag=1;
                break;
            }
    }
    if (flag==0) printf("Congrats, its a left truncated prime number");
    else printf("nope no never\n");

}
int prime_check(int n)
{
    int i,flag=0;
    if (n<=1) return 0;
    else if (n<=3) return 1;
    else
    {
        for (i=2;i<=sqrt(n);i++)
        {
            if(n%i==0)
            {
                flag=1;
                break;
            }
        }
    }
    if(flag==0) return 1;
    else return 0;
}
int num_digit(int n)
{
    int i,x=0;
    for (i=1;n!=0;i++)
    {
        n=n/10;
        x++;
    }
    return x;
}

谁能建议我哪一步是错的?它所做的只是检查数字是否为质数。

【问题讨论】:

  • pow(10, 3) 可能会返回类似999.99999999675321 的内容。也许将它四舍五入,或者更好(??),编写你自己的 integer 幂函数
  • @Aman Kumar 语句 x=1 中使用的变量 x 在哪里?宣布?
  • for (i=2;i&lt;=sqrt(n);i++) 可能有 FP 截断问题。建议for (i=3;i&lt;=n/i;i+=2)
  • @VladfromMoscow 我的错,它不是 x,它实际上是“标志”。顺便说一句,它仍然不起作用。
  • @pmg 你能推荐一种写幂函数的方法

标签: c expression primes integer-arithmetic function-definition


【解决方案1】:

您不应该使用浮点表达式。它们会产生意想不到的结果。

例如,假设num 等于13

在这种情况下是表达式

num/pow(10,(y-1))

将产生一个双精度值1.3,因为函数pow 的返回类型是双精度。所以整个表达式也将具有 double 类型。该代码不使用整数运算。

现在是表达式

((num/pow(10,(y-1)))*pow(10,(y-1)))

将产生等于 13 ( 1.3 * 10 == 13) 的双精度值

结果变量num在这个语句之后

num = num-((num/pow(10,(y-1)))*pow(10,(y-1)));

将等于0,而不是预期值3

在不使用浮点函数的情况下,例如程序可以如下所示。

#include <stdio.h>

int is_prime( unsigned long long n )
{
    int prime = n % 2 == 0 ? n == 2 : n != 1;
    
    for ( unsigned long long i = 3; prime && i <= n / i; i += 2 )
    {
        prime = n % i != 0;
    }
    
    return prime;
}

size_t number_size( unsigned long long int n )
{
    const unsigned long long Base = 10;
    
    size_t size = 0;
    
    do
    {
        ++size;
    } while ( n /= Base );
    
    return size;
}

int main( void ) 
{
    const unsigned int Base = 10;
    
    unsigned n = 0;
    
    printf( "Enter a non-negative number: " );
    scanf( "%u", &n );
    
    size_t size = number_size( n );
    
    unsigned int power = 1;
    
    while ( --size ) power *= Base;
    
    for ( unsigned int tmp = n; power && is_prime( tmp ); power /= Base )
    {
        tmp %= power;
    }
    
    if ( power == 0 )
    {
        printf( "Congrats, %u is a left truncated prime number.\n", n );
    } 
    else
    {
        printf( "nope no never.\n" );
    }
    
    return 0;
}

例如,数字1713 是左截断素数,而数字1911 不是左截断素数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 2014-07-24
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2016-01-25
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多