2016-04-14 27 views
0

我试图在C上对HackerRank解决一个挑战。有一个有n行和列的正方形矩阵。挑战是将矩阵对角线的两个和之间的绝对差作为单个整数进行打印。Printf不起作用,除非另有printf存在

这里的链接: https://www.hackerrank.com/challenges/diagonal-difference

我能够得到正确的答案,但在代码结尾中的printf()语句不工作,除非我之前添加不必要的printf(“”) for循环语句。 有人可以解释为什么会发生这种情况吗?

在此先感谢

下面的代码:

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

int main() 
{ 
    int n; 
    scanf("%d",&n); 
    int a[n][n],sum_d1=0,sum_d2=0,a_i,a_j; 
    for(a_i = 1; a_i <= n; a_i++) 
    { 
     for(a_j = 1; a_j <= n; a_j++) 
     { 
      scanf("%d",&a[a_i][a_j]); 
      if(a_j==a_i) 
       sum_d1=sum_d1+a[a_i][a_j]; 
     } 
    } 
    printf("");// the last printf works only when this statement is present 
    for(a_i=1;a_i<=n;a_i++) 
    { 
     for(a_j=n;a_j>0;a_j--) 
     { 
      if((a_i+a_j)==(n+1)) 
       sum_d2=sum_d2+a[a_i][a_j]; 
     } 
    } 
    printf("%d",abs(sum_d1-sum_d2)); //this doesn't work if there is no printf above 
    return 0; 
} 
+1

你有不确定的行为,因为你是在位置索引你的阵列'[ N]'。 – paddy

+3

您还有一个缺失的换行错误。将'\ n'添加到格式字符串的末尾以修复它。那样这条线就会正常结束,而不是退出程序。 –

+0

@TomKarzes为什么会修复之前的空字符串printf? – Barmar

回答

3

其后的换行符是这里的关键。标准输出仅在出现性能问题时遇到结束行时刷新。如果您更改为fprintf(stderr,...),那么您的代码将按原样工作。你也可以在你的printf之后使用fflush(stdout)。

1

正如其他人提到的,你的主要问题是你的数组声明/使用。 C中的数组的第一个索引从0开始,而不是从1开始。因此,当您尝试将数组存储在数组中时,或者再次访问数组时,它超出了数组的边界,并且可能以非预期的方式进行操作。

阵列例如:数组[2] [3]

0 1 
0 a| b | 
1 c| d | 
2 e| f | 

Array[0][0] == a 
Array[1][1] == d 
Array[1][2] == f 

在代码中,如果有人进入 “1”,尺寸[1] [1],创建的阵列 - 的单个元素。这应该使用[0] [0]来访问,但是在代码中被一个[1] [1]访问,这是一个无效的元素,因为它不是数组的一部分。

没有确切知道你想要你的代码,这样做,我不能修复它完全,但一个良好的开端将是如下:

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

int main(){ 
    int n; 
    scanf("%d",&n); 
    int a[n][n],sum_d1=0,sum_d2=0,a_i,a_j; 
    for(a_i = 0; a_i < n; a_i++){ 
     for(a_j = 0; a_j < n; a_j++){ 
      scanf("%d",&a[a_i][a_j]); 
      if(a_j==a_i) 
       sum_d1=sum_d1+a[a_i][a_j]; 
     } 
    } 
    //printf("");// the last printf works only when this statement is present 
    for(a_i=0;a_i<n;a_i++) 
    { 
     for(a_j=n-1;a_j>=0;a_j--) 
     { 
      if((a_i+a_j)==(n+1)) 
       sum_d2=sum_d2+a[a_i][a_j]; 
     } 
    } 
    printf("%d",abs(sum_d1-sum_d2)); //this doesn't work if there is no printf above 
    return 0; 
}