C 如何改进以下代码';她的表现如何?

C 如何改进以下代码';她的表现如何?,c,performance,C,Performance,问题是。 使用数组的值查找输入变量的最大GCD 投入如下:- 第一行包含两个整数,N和Q 第二行包含构成arr[]的N个整数 接下来,Q行包含一个整数M,她希望返回的时间(以秒为单位) #include <stdio.h> int main(){ int n,q; scanf("%d %d", &n,&q); int a[n]; int gcdn[n]; for (int i = 0;i < n; i++) {

问题是。 使用数组的值查找输入变量的最大GCD

投入如下:- 第一行包含两个整数,N和Q

第二行包含构成arr[]的N个整数

接下来,Q行包含一个整数M,她希望返回的时间(以秒为单位)

#include <stdio.h>

int main(){
    int n,q;
    scanf("%d %d", &n,&q);
    int a[n];
    int gcdn[n];
    for (int i = 0;i < n; i++) {
        scanf("%d",&a[i]);      }
    while (q>0){
        q--;
        int x;
        scanf("%d",&x);
        for(int i=0;i<n;i++) {
            gcdn[i] = gcd(a[i],x);
        }
        printf("%d \n",max(gcdn,n));
    }

}

int gcd (int a, int b) {
    if (b==0)
        return a;
    else 
        return gcd(b, a%b);
}
int max(int *a,int n) {
    int max= a[0];
    for(int i = 1;i<n;i++) {
        if(a[i]>min) {
            max= a[i];
        }
    }
    return max;
}
#包括
int main(){
int n,q;
scanf(“%d%d”、&n和&q);
int a[n];
int gcdn[n];
对于(int i=0;i0){
q--;
int x;
scanf(“%d”和&x);

对于(int i=0;i而言,最明显的性能改进是数组没有排序:您需要先进行搜索(即
O(\log(n))
),而不是简单地向数组中添加元素,但一旦需要获得数组的最大值,您只需要第一个(或最后一个)条目。

我投票将此问题作为主题外的问题结束,因为它属于,您可以在计算GCD时跟踪最大值,无需存储它们并再次遍历。这几乎不是一个改进。您建议执行插入排序,即O(n log n)与现有O(n)相比解决方案。最明显的方法已经在评论部分说明了。