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);
}