【问题标题】:segmentaion fault runtime error in c doing spiral matrix implementationc中的分段错误运行时错误进行螺旋矩阵实现
【发布时间】:2016-10-26 05:28:00
【问题描述】:

我在hackerearth 上阅读了一个问题,它要求我们打印螺旋矩阵NN 的两条对角线的总和,其中N 作为输入。 a[0][0]=NN 的螺旋矩阵 以 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;
}

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 欢迎来到 Stack Overflow!听起来您可能需要学习如何使用调试器来逐步执行代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs.
  • 使用 malloc 代替 VLA。
  • @BLUEPIXY 可以如何显示
  • long long (*a)[n] = malloc(sizeof(long long [n][n])); 而不是。

标签: c algorithm matrix runtime-error spiral


【解决方案1】:

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
pre pre 角元素:13 - 3 = 10
pre pre pre 角元素: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;
}

【讨论】:

  • 但它没有给出 10000000 的预期 o/p,因为正确的 o/p 是 679604006 和 sum%(10^9 + 9)
  • lastValue -= n - 1; --> lastValue -= n - 1;sum %= 1000000009;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多