为什么这段代码没有为大型数组提供正确的结果?

时间:2014-09-09 13:07:20

标签: c arrays

首先我得到输入:

T \\ no of arrays 

n \\ size of array

a[i] \\ elements of array

然后我给出了a[i] = a[j]i!=j的索引的输出。

例如:

输入:

2   \\\ no arrays

3  \\ \ size of array 1

1 2 3 \\\ elements of array 1

3 \\\ size of array 2

1 1 2

输出:

0 \\\ as there is no same element

2 \\\ for (0,1) and (1,0) gets has same element "1"

约束:

1 ≤ T ≤ 10

1 ≤ n ≤ 100000 

1 ≤ a[i] ≤ 1000000

这是我的代码:

int main() {

    int t,T,n,i,j,count;
    scanf("%d",&T);
    for(t=0;t<T;t++){
        scanf("%d",&n);
        int a[n];
        count =0;
        int c[1000000] = { 0 };
        for(i=0;i<n;i++){
            scanf("%d",&a[i]);
            c[a[i]-1]++ ;
        }
        for(i=0;i<1000000;i++){
            if(c[i]>1)
            count+= c[i]*(c[i]-1);  
        }

        printf("%d\n",count);
    }
    return 0;
}

此代码不满足此testcase

1 个答案:

答案 0 :(得分:0)

这是正确的代码

#include<stdio.h>
#include<stdlib.h>
int main() {
    int t,T,n,i,j;
    long long int count,k;
    scanf("%d",&T);
    int *c = calloc(1000000,sizeof(int));      
    for(t=0;t<T;t++){
        scanf("%d",&n);
        int temp;
        count =0;

        for(i=0;i<n;i++){
            scanf("%d",&temp);
            c[temp-1]++ ;
        }

        for(i=0;i<1000000;i++){
            if(c[i]>1){
                k = c[i];
                count+= k*(k-1);
            }
            c[i] = 0;  
        }
        printf("%lld\n",count);

    }
    return 0;
}

变更:

  • 使用calloc将数组初始化为零(不知道为什么,但是你的 数组初始化的方法给出了分段错误)
  • 由于n的限制为100000因此输出可能高达n^2,即10000000000超出int范围,因此使用{ {1}} long long int变量。