#include<stdio.h> #include<math.h> int gcd(int x,int y) { int z=y; while(x%y!=0) { z=x%y; x=y; y=z; } return y; }//求最大公约数 int lmd(int x,int y) { return x/gcd(x,y)*y; }//求最小公倍数 int main () { int n;scanf("%d",&n); for (int k=0;k<n;++k) { int a0,a1,b0,b1; int flag=0; int i; scanf("%d %d %d %d",&a0,&a1,&b0,&b1); for(i=1;i<=b1;i++) { if(gcd(i,a0)==a1&&lmd(i,b0)==b1) flag++; } printf("%d\n",flag); } return 0; }降低代码的时间复杂度
时间: 2023-12-04 10:02:44 浏览: 97
实验4-报告.docx
这段代码的时间复杂度为O(n*b1*(log(b1)+log(a0)+log(b0))),其中n为输入的测试用例数量。可以从以下几个方面来降低时间复杂度:
1. 尽量减少重复计算,例如在lmd函数中可以先计算出x/gcd(x,y),然后再乘上y,避免重复计算gcd(x,y)。
2. 在循环中尽量减少不必要的计算,例如在当前的代码中,每次循环都要计算gcd(i,a0)和lmd(i,b0),可以将这些计算提出循环,避免重复计算。
3. 尽量使用更高效的算法和数据结构,例如可以使用线性筛法来预处理出每个数的质因数分解,然后利用质因数分解来计算最大公约数和最小公倍数,从而避免重复计算。
4. 如果数据范围允许,可以考虑使用位运算等更快速的计算方式,例如用位移运算来代替除法和乘法。
阅读全文