如何编写一个程序,由用户F0,F1和fmax输入3个输入,并输出所有的素数Fibonnaci数?

yftpprvb  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(97)

这段代码总是跳过前两个斐波那契数,它们是质数(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;

}

ctrmrzij

ctrmrzij1#

这应该足够了:

#include <iostream>
using namespace std;

int main(){
    int f0, f1, fn;
    cin >> f0 >> f1 >> fn;

    while(f0 <= fn){
        if(isPrime(f0)) cout << f0 << '\n';
        f1 = f0+f1;
        f0 = f1-f0;
    }

    return 0;
}

现在,关于这个问题的一个重要的评论:
如果你想知道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算法。

相关问题