-1

hackerearth に関する質問を読みました。入力として N を使用して、スパイラル行列 N N の両方の対角線の合計を出力するよう求められます。a[0][0]=N N で中心が 1 のスパイラル行列、すなわち

16  15  14  13

5   4   3   12

6   1   2   11

7   8   9   10

このためのコードを実装しましたが、入力 N >= 10^5 の場合にセグメンテーション エラーまたは実行時エラーが発生します

何が起こっているのか理解できません

#include <stdio.h>

int main(void) {
long long int n,test;
scanf("%lld",&test);
while(test--){
    scanf("%lld",&n);
    long long int p=n*n;
    long long int r1=0,r2=n-1,c1=0,c2=n-1,i,j;
    long long int a[n][n];
    while(p>=1)
    {
        for(i=c1;i<=c2;i++)
        {
            a[r1][i]=p--;
        }
        for(j=r1+1;j<=r2;j++)
        {
            a[j][c2]=p--;
        }
        for(i=c2-1;i>=c1;i--)
        {
            a[r2][i]=p--;
        }
        for(j=r2-1;j>=r1+1;j--)
        {
            a[j][c1]=p--;
        }
        c1++;
        c2--;
        r1++;
        r2--;
    }
    long long int sum=0;
       for ( i = 0, j =0; i< n && j < n; i++, j++) {
              sum = sum + a[i][j];

       }

       for ( i=0,j=n-1 ; i<n && j>=0 ; i++, j--) {
              sum= sum + a[i][j];

       }

           printf("%lld\n",sum%1000000009);


}
return 0;
}
4

1 に答える 1

0

long long int a[n][n];N >= 10^5 の場合、大きすぎてスタックに確保できません

と置換するlong long (*a)[n] = malloc(sizeof(long long [n][n]));


16  15  14  13

5   4   3   12

6   1   2   11

7   8   9   10

最後の要素は n * n です: (4 * 4 = 16)
コーナー前の要素は最後の要素です - (n - 1) : 16 - (4 - 1) = 16 - 3 = 13
コーナー前の要素: 13 - 3 = 10
プリプリプリコーナー要素 : 10 - 3 = 7
(4 回)


二次元配列を使わない方法。

#include <stdio.h>

int main(void){
    long long n;//The length of the side
    long long lastValue;//n*n
    long long sum = 0;

    scanf("%lld", &n);

    sum += (n & 1);//center (1) if odd, Not counting duplicates;

    while(n >= 2){
        lastValue = n * n;
        for(int i = 0; i < 4; ++i){//4 times
            sum += lastValue;
            lastValue -= n - 1;//pre lastValue..
        }
        n -= 2;
    }
    printf("Ans.%lld\n", sum);
    return 0;
}
于 2016-06-23T22:37:00.617 に答える