我需要计算数组元素之间的差异(仅当下一个元素大于前一个元素时),并用第一个数组元素返回这些差异的总和。
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;
}我怎样才能做到这一点?
发布于 2015-06-06 15:01:09
问题是,对于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.发布于 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。
https://stackoverflow.com/questions/30683938
复制相似问题