数组元素之间的差异总和

时间:2015-06-06 14:18:47

标签: c arrays

我需要计算数组元素之间的差异(仅当下一个元素大于前一个元素时),并将这些差异的总和与第一个数组元素一起返回。

3
1 5 6
ans = 1 + [5-1] + [6-5] = 6

这是我的代码:

#include <stdio.h>

int main() {
  long long int T, N, M[100000], i, j, diff[100000];
  int sum = 0;
  scanf("%lld", &T);

  while (T--) {
    scanf("%lld", &N);
    for (i = 0; i < N; i++) {
      scanf("%lld", &M[i]);
    }
    for (i = 0; i < N-1; i++) {
      if (M[i] < M[i+1]) {
        diff[i] = M[i+1] - M[i];
        sum = sum + diff[i];
      }
    }
    printf("%d\n", sum + M[0]);
  }
  return 0;
}

我如何做到这一点?

2 个答案:

答案 0 :(得分:0)

问题是,对于sum的每次迭代,您都没有将T重置为零。因此,它在后续测试用例中错误地保留了先前测试用例的总和。

您可以通过在sum = 0;循环开头设置while(T--)来解决此问题。

此外,我将如何重写此内容:

#include <stdio.h>
#include <stdlib.h>

typedef long long int num_t;
#define NUMFMT "%lld"

int main() {

    num_t T;
    scanf(NUMFMT,&T);
    while (T--) {
        num_t N;
        scanf(NUMFMT,&N);
        if (N < 1) { fprintf(stderr, "error: require at least one number.\n" ); exit(1); }
        N--;
        num_t M1;
        scanf(NUMFMT,&M1);
        num_t sum = M1;
        while (N--) {
            num_t M2;
            scanf(NUMFMT,&M2);
            if (M1 < M2)
                sum += M2-M1;
            M1 = M2;
        } // end while
        printf(NUMFMT"\n",sum);
    } // end while

    return 0;

} // end main()

演示:

ls;
## acus.c
gcc acus.c -o acus;
ls;
## acus.c  acus*
./acus;
## 6
## 1 5
## 5
## 3 1 2 3
## 3
## 3 3 2 1
## 3
## 3 1 5 6
## 6
## 4 6 4 2 3
## 7
## 0
## error: require at least one number.

答案 1 :(得分:0)

这应该在代码审查中......

您的代码读取T,并通过循环销毁其值。做自己和读者一个忙,并调用变量&#34; numberOfTestCases&#34;,然后为(long long testCase = 0; testCase&lt; numberOfTestCases; ++ testCase)做一个循环...那个&#39; s写循环的标准方法。相信我,更长的变量名称不会减慢代码速度。

您将M声明为long long int,并将其声明为int。现在考虑一下:即使在最简单的情况下,M [0] = 0且M [1]> 0,如果M [1]很大,那么它就不适合int。这绝对没有意义。 sum保持的值必须与M保持的值相同或更大。

您在测试用例的循环外声明并初始化了总和。您可能已经了解到应始终初始化变量。错误。这里的初始化只是隐藏了一个致命的错误,那就是你不能再次将总和重置为0。你应该在你的循环中声明了sum,只针对一个测试用例。在循环外声明并初始化它是一个等待发生的错误。

diff数组完全没有意义。你只是在浪费800KB的内存。从不使用变量j,这令人困惑。

您正在为类型不相关的各种项目使用一个声明。 T的类型应基于您需要处理的最大测试集数量。 N和i的类型应基于测试中的最大值。 M的类型应该基于输入值有多大的要求。这三种类型是无关的,你仍然使用一个声明。 &#34;事故等待发生&#34;。

如果N&gt;您的应用会崩溃100,000或N = LLONG_MIN。

您将所有功能都放入main()。那不是主要的东西。 main()应该设置你的应用程序并启动它。很可能main()应该调用函数do_homework,而do_homework应该调用函数read_data和calculate_sum。