问题描述
我编写了一个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;
}
例如,数字17
,13
保留为可截短的质数,而数字19
,11
则保留为不可截短的质数。