我尝试创建的程序应该打印从键盘扫描的数字是否为质数。该程序应使用递归函数来确定数字是否为质数。我创建的程序没有编译问题。但是,当main()函数调用用于确定数字是否为质数的函数(我称此函数为质数)时,似乎返回从键盘扫描的整数始终为质数。质数和非质数都是这种情况。我创建的程序如下所示:
#include <stdio.h>
//function for determining whether a number is prime or not
int isprime(int i, int n){
i = 2;
if(n > 1){
/* i = 2, i is the divisor that checks whether n (the number
being checked for being prime) is in fact prime */
if(n % i == 0){
return 1;
}
/* recursive step that returns function with increased value
of i */
isprime(i + 1, n);
}
else {
return 0;
}
return -1;
}
int main(){
int x;
//scans integer from the keyboard
scanf("%d", &x);
//calls recursive function
if(isprime(2, x) == 1){
printf("%d is prime\n", x);
}
if(isprime(2, x) == 0){
printf("%d is not prime\n", x);
}
return 0;
}
最后一个问题:正在像我的程序中那样调用递归函数:
isprime(2, x)
使用正确的语法?将数字2直接插入函数的参数是否正确?
感谢您的帮助!:)
答案 0 :(得分:0)
以下建议的代码:
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
int isprime( unsigned i, unsigned n )
{
if( n < 2 )
{ // cannot be prime
return 1;
}
if( i >= n )
return 0;
if(n % i == 0)
{ // then, not prime
return 1;
}
return isprime(i + 1, n );
}
int main( void )
{
unsigned x;
if( scanf("%u", &x) != 1 )
{
fprintf( stderr, "scanf failed\n" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
if( !isprime(2, x ) )
{
printf("%d is prime\n", x);
}
else
{
printf("%d is not prime\n", x);
}
return 0;
}
答案 1 :(得分:0)
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int is_prime(int n, int div)
{
if (n <= 1)
return 0;
else if (div <= 1)
return 1;
else if (n % div == 0)
return 0;
return is_prime(n, --div);
}
int main()
{
for (int i = 0; i < 100; i++)
{
printf("%d is %s\n", i, is_prime(i, (int)(sqrt(i)))? "prime":"not prime");
}
return 0;
}
您需要传递的两个参数是要检查的数字及其平方根。您不需要检查大于此的数字,因为如果您考虑一下,实际上就没有必要。
例如,如果您的电话号码是16,则只需要检查1到4之间的数字即可。这种情况很难解释,因此请参见下表:
1*16
2*8
4*4
8*2 <----- We already checked this!!
...
希望这会有所帮助!
答案 2 :(得分:0)
我建议您在一般的https://www.sub.foo.com/
函数中处理参数测试(负输入)和特殊情况(偶数甚至是2以外的数字),但是一旦数据干净,就将计算移到集中的{{1 }}函数,避免重复测试:
is_prime()
答案 3 :(得分:0)
这是我创建的程序,该程序使用递归函数确定数字是否为质数!程序中的注释解释了每个部分!希望这对尝试创建类似程序的人有所帮助!
#include <stdio.h>
// i = divisor
// n = number being checked for being prime
int isprime(int i, int n){
//base case one: 1 is not prime
if (n == 1){
return 0;
}
//base case two: 2 is prime
if (n == 2){
return 1;
}
//if i is a divisor then n not prime
if (n % i == 0){
return 0;
}
/* if root of n is reached while trying
to find a divisor but no divisor found, so
no previous return, then we have a prime number */
if (i * i > n){
return 1;
}
//recursive step, trying next value as divisor
return isprime(i + 1, n);
}
int main(){
int x;
scanf("%d", &x);
if(isprime(2, x) == 1){
printf("%d is prime\n", x);
}
if(isprime(2, x) == 0){
printf("%d is not prime\n", x);
}
return 0;
}
该程序的输入如下:
3
该程序的输出如下:
3 is prime