- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了一个程序,其中只有 printf
语句导致输出发生变化。
我有一个 n
元素数组。对于每d
个连续元素的median
,如果第(d+1)个元素
大于等于它的两倍(中位数),我正在增加 notifications
的值。完整的问题陈述可以引用here .
这是我的程序:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#define RANGE 200
float find_median(int *freq, int *ar, int i, int d) {
int *count = (int *)calloc(sizeof(int), RANGE + 1);
for (int j = 0; j <= RANGE; j++) {
count[j] = freq[j];
}
for (int j = 1; j <= RANGE; j++) {
count[j] += count[j - 1];
}
int *arr = (int *)malloc(sizeof(int) * d);
float median;
for (int j = i; j < i + d; j++) {
int index = count[ar[j]] - 1;
arr[index] = ar[j];
count[ar[j]]--;
if (index == d / 2) {
if (d % 2 == 0) {
median = (float)(arr[index] + arr[index - 1]) / 2;
} else {
median = arr[index];
}
break;
}
}
free(count);
free(arr);
return median;
}
int main() {
int n, d;
scanf("%d %d", &n, &d);
int *arr = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%i", &arr[i]);
}
int *freq = (int *)calloc(sizeof(int), RANGE + 1);
int notifications = 0;
if (d < n) {
for (int i = 0; i < d; i++)
freq[arr[i]]++;
for (int i = 0; i < n - d; i++) {
float median = find_median(freq, arr, i, d); /* Count sorts the arr elements in the range i to i+d-1 and returns the median */
if (arr[i + d] >= 2 * median) { /* If the (i+d)th element is greater or equals to twice the median, increments notifications*/
printf("X");
notifications++;
}
freq[arr[i]]--;
freq[arr[i + d]]++;
}
}
printf("%d", notifications);
return 0;
}
现在,对于像 this 这样的大输入,程序输出 936
作为 notifications
的值,而当我只排除语句 printf("X")
时,程序输出 1027
作为 notifications
的值。我真的无法理解是什么导致我的程序出现这种行为,以及我遗漏/监督了什么。
最佳答案
你的程序在这里有未定义的行为:
for (int j = 0; j <= RANGE; j++) {
count[j] += count[j - 1];
}
您应该在 j = 1
处开始循环。按照编码,您在数组 count
开始之前访问内存,这可能会导致崩溃或产生不可预测的值。更改运行环境中的任何内容都可能导致不同的行为。事实上,即使什么都不改变。
其余代码乍一看比较难理解,但考虑到索引值的计算,那里可能也会有更多问题。
对于初学者,您应该添加一些一致性检查:
scanf()
的返回值以确保正确转换。arr
的值,它们必须在 0..RANGE
范围内int index = count[ar[j]] - 1;
永远不会产生负数。count[ar[j]]--;
也是如此median = (float)(arr[index] + arr[index - 1])/2;
永远不会用 index == 0
求值。关于c - 为什么使用不相关的 printf 语句导致我的程序输出发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46409415/
我有这张图: digraph G { 1 [label="car"]; 2 [label="x"]; 3 [label="car"]; 4 [label="y"]; 5 [label="cdr"];
我有一个大型查询,其中一个简单的子查询优化将其从 8 分钟缩短到 20 秒。我不确定我是否理解为什么优化会产生如此巨大的效果。 本质上,这是问题部分: SELECT (bunch of stuff)
我在 NetBeans IDE 6.9.1 和 GlassFish 3 中遇到非常奇怪的问题。在使用 64 位 JDK 在 Windows 7 上安装 NetBeans 后,在没有创建任何项目的情况下
我有两个长度相同的数组。第一个数组是静态的,具有这种格式的数据 a = [['q', 10], ['s', 20], ['z', 40], ['d', 15]] 和另一个数组 b = [1, 0, 0
我在下面的代码中有一个编译错误。编译器似乎将类方法 set 解释为一个模板,乍一看,它与我的代码完全无关。 #include #include using namespace std; templ
我有一个完整的 Canvas CCLayer,上面有几个小的 CCLayer - 它们是按钮。在按钮上我启用了触摸监听器: - (id)init { if ((self = [super init
关于 this page ,当您将鼠标悬停在右上角的红色标记上时,css3 变换会旋转图像。这按预期工作,但 div.last.half 短暂地向右单击并返回到它的原始位置。 这仅出现在 Chrome
我目前正在重新设计我的网站以包含两栏。左栏是带有一些链接和文本的侧边栏,右栏是页面的正文(不是 )。我遇到的问题是页面上两个完全独立的元素的 CSS 规则会影响这两个元素。 因为这可能没有意义,这是
这是问题 here 的跟进关于使用参数依赖查找 (ADL) 的函数重载。我想检查一下我在这种情况下对规则的理解,所以我写了一些测试代码。 首先,在 std 中当然没有 HasPtr 类的交换,所以我写
我是 Developer Portal 中两个开发团队的成员。一个团队不再存在,也不再由团队的“代理”维护。 现在这就是我的问题。我正在尝试在 Xcode 中刷新我的配置文件,但不断收到一条消息,告诉
在调试问题时,我注意到在改变方向时,viewDidLoad不相关的UIViewController正在被调用。 它似乎与我的问题无关,但这完全很奇怪。 这个UIViewController只能从 UI
今晚,当我拖放一个早上运行良好的项目时,我继续收到数千个这样的错误。我有 140 个类,我无法跟踪我所做的所有修改:(。但我从未更改过与拖/放功能相关的任何内容。我已经完全远离了代码中引发这些问题的行
我的网页布局有一个奇怪的行为。当我在“sideBar”div 中添加更多 div 时,网页的中心部分被下推。它们与中心部分无关。他们有边界,我看到他们离“主要”分区很远。有什么办法可以防止它,或者我每
我们有 3 个独立的 git 存储库(每个都有一些分支),我们想将它们 merge 为一个保留完整历史记录和访问分支的能力,如下所示: 这就是我们所拥有的。 3 个 repo : /A/.git /B
我意识到“为什么会这样”的问题通常不是最好的问题,但是 SO 上有很多人关注标准委员会的讨论,所以我希望可以如实回答,因为我很好奇至于答案是什么。 基本上,当我第一次看到 std::result_of
我已经设法使 SqlDependency 正常工作,但前提是我不在我认为与 SqlDependency 无关的 SQL 事务中使用 IsolationLevel.ReadUncommited。 当我在
我一直在尝试使用反射动态设置字段。当谈到泛型类时,有一个障碍。考虑这段代码: 包装器.java: public class Wrapper { private T var; publi
我是一名优秀的程序员,十分优秀!