首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组元素之间的差和

数组元素之间的差和
EN

Stack Overflow用户
提问于 2015-06-06 14:18:47
回答 2查看 170关注 0票数 0

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

代码语言:javascript
复制
3
1 5 6
ans = 1 + [5-1] + [6-5] = 6

这是我的密码:

代码语言:javascript
复制
#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;
}

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-06 15:01:09

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

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

另外,下面是我要重写的方法:

代码语言:javascript
复制
#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()

演示:

代码语言:javascript
复制
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.
票数 0
EN

Stack Overflow用户

发布于 2015-06-06 15:50:34

这应该在代码评审中..。

您的代码读取T,并通过循环破坏其值。请给自己和读者一个方便,然后调用变量"numberOfTestCases",然后执行一个循环(long testCase = 0;testCase < numberOfTestCases;++testCase) .这是编写循环的标准方法。相信我,较长的变量名不会减慢代码的速度。

你宣布M为长int,和int为sum。现在考虑一下:即使在最简单的情况下,M=0和M1> 0,如果M1很大,那么它就不适合一个int。这绝对没道理。和保持的值必须与M持有的值相同或更大。

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

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

对于类型不相关的各个项,您将使用一个声明。T的类型应该基于您需要处理的最大测试集数。N和I的类型应该基于测试中的最大值。M的类型应该基于输入值可以有多大的要求。这三种类型是不相关的,仍然使用一个声明。“意外等待发生”。

如果N> 100,000或N= LLONG_MIN,应用程序就会崩溃。

将所有功能放入main ()中。这不是主要的原因。main ()应该设置应用程序并启动程序。最有可能的是main ()应该调用函数do_homework,而do_homework应该调用函数read_data和calculate_sum。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30683938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档