2016-04-14 2 views
0

Я пытался решить задачу в C на HackerRank. Существует квадратная матрица с n строками и столбцами. Задача состоит в том, чтобы напечатать абсолютную разницу между двумя суммами диагоналей матрицы как одно целое.Printf не работает, если присутствует другой printf

Вот ссылка: https://www.hackerrank.com/challenges/diagonal-difference

Я могу получить правильный ответ, но оператор Е() в конце кода не работает, если я не добавить ненужный Printf («») до для оператора цикла. Может ли кто-нибудь объяснить, почему это происходит?

Заранее спасибо

Вот код:

#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

Вы неопределенное поведение, потому что вы индексирует массив в позиции '[ п] '. – paddy

+3

У вас также отсутствует ошибка новой строки. Добавьте '\ n' в конец строки формата, чтобы исправить ее. Таким образом, линия закончится правильно, а не болтается при выходе из программы. –

+0

@TomKarzes Почему пустая строка printf до этого исправить? – Barmar

ответ

3

волочить новой строки является ключевым здесь. Стандарт только сбрасывает, когда он сталкивается с линией, заканчивающейся по соображениям производительности. Если вы измените на fprintf (stderr, ...), тогда ваш код будет работать как есть. Вы также можете использовать fflush (stdout) после печати.

1

Как уже отмечалось еще несколькими людьми, ваша основная проблема - объявление/использование массива. Массивы в C имеют свой первый индекс от 0, а не от 1. Таким образом, когда вы пытаетесь хранить вещи в своем массиве или снова обращаетесь к ним, они выходят за границы массива и могут действовать непреднамеренно.

Пример массива: Array [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; 
} 
Смежные вопросы