2016-04-14 22 views
0

HackerRank üzerinde C'deki bir sorunu çözmeye çalışıyordum. N satır ve sütunları olan kare bir matris vardır. Meydan okuma, matrisin iki köşesi arasındaki mutlak farkı tek bir tam sayı olarak basmaktır. Daha önce ("") gereksiz bir printf eklemek sürece çalışmaz doğru cevabı ancak kodun sonuna printf() deyimi elde edebilir kulüpler https://www.hackerrank.com/challenges/diagonal-differenceBaşka bir printf olmadığı sürece Printf çalışmaz

: Burada

bağlantı var döngü ifadesi için. Birisi bunun neden olduğunu açıklayabilir mi? İşte

peşin

yılında

Teşekkür kod:

#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

Eğer pozisyonda dizinizi indeksleme olduğunuz için tanımsız davranışa sahip '[ n] '. – paddy

+3

Ayrıca yeni bir satır hatası da var. Düzeltmek için biçim dizenizin sonuna '\ n 'ekleyin. Bu şekilde hat, program çıkışı üzerine sarkıtmak yerine düzgün bir şekilde bitecektir. –

+0

@TomKarzes Boş dize bundan önce neden bunu düzeltir? – Barmar

cevap

3

satırsonu burada anahtarıdır. Standart, yalnızca performans nedenleriyle biten bir satırla karşılaştığında sadece yıkamadır. Fprintf (stderr, ...) olarak değiştirirseniz, kodunuz olduğu gibi çalışır. Ayrıca, printf'inizden sonra fflush (stdout) kullanabilirsiniz.

1

Birkaç kişi daha önce de belirttiğimiz gibi, ana sorun dizinizdeki deklarasyon/kullanımdır. C dizileri, ilk dizini 0'dan değil, 0'dan alır. Bu nedenle, dizilerinizde bir şeyler denediğinizde veya bunları tekrar depoladığınızda, dizinin sınırını aşar ve istenmeyen şekilde davranabilir.

Dizi örneğin: - tek bir eleman Dizi [2] [3] Kodunuzda

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

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

, birisi, boyut [1] [1] oluşturulur bir dizi "1" girerse. Bu bir [0] [0] kullanılarak erişilebilmelidir, ancak kodda bir [1] [1] tarafından erişilmekte olup, bu da dizinin bir parçası olmadığı için geçersiz bir unsurdur. Yapmanız kodunuzu niyetinde tam olarak ne olduğunu bilmeden

, ben tamamen tamir edemez, ama iyi bir başlangıç ​​olarak aşağıda olacaktır:

#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; 
}