我试图在HackerRank上解决C中的挑战。有一个有n行和列的方形矩阵。挑战在于将矩阵对角线的两个和之间的绝对差值打印为单个整数。
这是链接: https://www.hackerrank.com/challenges/diagonal-difference
我能够得到正确的答案,但代码末尾的printf()语句不起作用,除非我在for循环语句之前添加了不必要的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;
}
答案 0 :(得分:3)
尾随换行符是关键所在。标准输出仅在遇到因性能原因而结束的行时才刷新。如果您更改为fprintf(stderr,...),那么您的代码将按原样运行。你也可以在printf之后使用fflush(stdout)。
答案 1 :(得分: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;
}