C程序-可截断的左素数

问题描述

我编写了一个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;
}

有人可以建议我哪一步出错吗?它要做的就是检查数字是否为素数。

解决方法

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

例如,假设num等于13

在这种情况下,表达式

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

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

现在是表达式

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

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

因此,此语句后的变量num

num = num-((num/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则保留为不可截短的质数。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...