我读了一个关于hackerearth的问题,它要求我们打印螺旋矩阵N N的两个对角线的总和,其中N为输入。具有[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;
}
答案 0 :(得分: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
pre pre pre corner element:10 - 3 = 7
(4次)
一种不使用2D阵列的方法。
#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;
}