Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何优化此代码?斐波那契素数的代码?_C - Fatal编程技术网

C 如何优化此代码?斐波那契素数的代码?

C 如何优化此代码?斐波那契素数的代码?,c,C,我的代码 #包括 int-isprime(长int-n); int-isfib(长int-n); int main() { int t; long int i; scanf(“%d”、&t); 而(t--) { scanf(“%ld”、&i); 如果(i) { printf(“%d\n”,isfib(i)); } 其他的 { printf(“0\n”); } } } int-isprime(长int-n) { int j; 如果(n==1) { 返回0; } 对于(j=2;j与一些老兵相比,我对

我的代码

#包括
int-isprime(长int-n);
int-isfib(长int-n);
int main()
{
int t;
long int i;
scanf(“%d”、&t);
而(t--)
{
scanf(“%ld”、&i);
如果(i)
{
printf(“%d\n”,isfib(i));
}
其他的
{
printf(“0\n”);
}
}
}
int-isprime(长int-n)
{
int j;
如果(n==1)
{
返回0;
}

对于(j=2;j与一些老兵相比,我对编程相当陌生,所以如果我错了,请纠正我。我在您的代码中没有看到任何指针,这意味着您的一些变量可以转换为寄存器存储类


寄存器类变量存储在CPU寄存器中,而不是内存中,因此对于经常使用的变量,它非常适合优化。在您的情况下,强烈建议使用“i”,但这可以实现到您的所有变量。

对于初学者,您的
isprime
实现速度非常慢。这一个更快:

#include<stdio.h>
int isprime(long int n);
int isfib(long int n);

int main()
{
    int t;
    long int i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%ld",&i);
        if(isprime(i))
        {
            printf("%d\n",isfib(i));
        }
        else
        {
            printf("0\n");
        }
    }
}

int isprime(long int n)
{
    int j;
    if(n==1)
    {
        return 0;
    }
    for(j=2;j<=n/2;j++)
    {
        if(n%j==0)
        {
            return 0;
        }
    }
    return 1;
}

int isfib(long int n)
{
   long int a=0,b=1,c=0;
    while(1)
    {
        c=a+b;
        if(c<n)
        {
          a=b;
          b=c; 
        }
        else if(c==n)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
}

在这里,
arr
是一个巨大的数组,初始化为
1
0
之外的其他值。我选择
char
来节省内存,但这可以通过一些散列函数进一步改进。你可以对斐波那契数使用相同的原理。

有更好的算法来完成你想做的事情,这很容易找到您可以搜索。有一些方法可以优化此代码。首先,如果输入相同,您将再次计算
isFib
isPrime
。也许您可以将其存储在某个地方。此外,您的
isPrime
只需迭代到
sqrt(n)即可进一步优化
。此外,您要反复计算斐波那契数,存储它可以大大加快速度。这显然是某种在线竞争。您应该在问题中链接它。可能值的上限10^^75远远超出64位整数所能存储的范围。您需要找到一些替代方法来oesn不涉及将完整数字存储为整数。这样的微优化显然是错误的。
int isprime(int n) {
    if(n == 1) return 0;
    int i=2;
    while(i*i<n) {
        if(n%i == 0)
            return 0;
        i++;
    }
    return 1;
}
int isprimeandsaveresult(int n, char * arr) {
    if(arr[n] == 1) return 1;
    if(arr[n] == 0) return 0;
    return arr[n] = isprime(n);
}