这段代码总是跳过前两个斐波那契数,它们是质数(F0和F1),我需要写一个广义斐波那契序列,它们也是质数。其中Fn =Fn−1 +Fn−2,我知道我的问题在循环中,但我没有弄清楚。
#include <stdio.h>
#include <stdlib.h>
#define false 0
#define true 1
int main(int argc, char **argv)
{
int NN, PN, i, terms;
int F0;
int F1;
int Fmax;
char *p;
terms = Fmax = strtol(argv[3], &p, 10);
F0 = strtol(argv[1], &p, 10);;
F1 = strtol(argv[2], &p, 10);
F0 = strtol(argv[1], &p, 10);
if (*p != '\0')
{
return 1;
}
F1 = strtol(argv[2], &p, 10);
if (*p != '\0')
{
return 1;
}
Fmax = strtol(argv[3], &p, 10);
if (*p != '\0')
{
return 1;
}
if (argc != 4)
{
printf("Error: Please enter only 3 values, for F0, F1 and Fmax\n");
return 1;
}
if (F0 < 1 || F1 < 1 || Fmax < 1)
{
printf("Error: Please put only positive values\n");
}
if (F0 > F1)
{
printf("Error: F0 can not be bigger than F1\n");
}
if (Fmax < F1)
{
printf("Error: Fmax can`t be less than F1\n");
}
if (F0 < 1 || Fmax > 1000000)
{
printf("Error: Please enter a value between 1 and 1000000\n");
return 1;
}
我相信问题就在这里,但我试着把术语设置为Fmax,实际上我在网上看到了一些代码,它们应该有同样的目的。
else
{
if (F1 == 2)
{
printf("2\n");
}
for(i = 0; i < terms; i++)
{
NN = F0 + F1;
F0 = F1;
F1 = NN;
for(PN = 3; PN <= NN; PN++)
{
if(PN == NN)
printf("%d\n", NN);
if (NN > Fmax)
break;
if (NN % PN == 0)
break;
}
}
}
return 0;
}
1条答案
按热度按时间ctrmrzij1#
这应该足够了:
现在,关于这个问题的一个重要的评论:
如果你想知道
f(n)
是否是素数,你可以使用线性递归来找到一个封闭的公式来知道这个值。f(n) = Fib(n-1)*(f(0)+f(1)) + Fib(n-2)*f(1)
从这个封闭的公式中,你可以分辨出一些重要的事实:
1.如果
gcd(f(0), f(1)) != 1
.然后,在你的序列中没有素数(当然忽略f(0)
和f(1)
)。1.如果
f(1)%Fib(n-1) == 0
.因此,f(n)
不是质数。1.如果
Fib(n-2)%(f0+f1) == 0
.因此,f(n)
不是质数。函数
isPrime(n)
是一个高效函数,如果n
是素数,则返回true
,否则返回false
。有关该函数的更多信息,您可以搜索
primality testing
作为Miller-Rabin算法。