2016-04-14 32 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; 
}