这是问题所在
您注意到设备重复了相同的频率更改列表 以上。要校准设备,您需要找到第一个 频率达到两倍。
例如,使用上面相同的更改列表,设备将 循环如下:
- 当前频率0,变化+1;结果频率1.
- 当前频率1,变化为-2;结果频率为-1。
- 当前频率-1,变化+3;结果频率2。
- 当前频率2,变化+1;结果频率3。
- (此时,设备将从列表的开头继续。)
- 当前频率3,变化+1;结果频率为4。
- 当前频率4,变化为-2;结果频率2,这已经被发现。
在此示例中,第一个达到两次的频率为2。请注意, 您的设备可能需要重复其频率变化列表,其中许多 找到重复频率之前的时间,并且可能重复 可以在处理列表的中间找到。
还有其他示例:
- + 1,-1首先达到0两次。
- + 3,+ 3,+ 4,-2,-4首先达到10两次。
- -6,+ 3,+ 8,+ 5,-6首先达到5两次。
- + 7,+ 7,-2,-7,-4首先两次达到14。
您的设备达到两次的第一个频率是什么?
这是我在C中的实现,它遍历整个列表,但从未找到匹配项。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
int main(void){
int sum = 0;
int q = 0;
int len = 0;
char buffer[20];
int val = 0;
int list[2000];
int *plist = list;
FILE *pFile = NULL;
pFile = fopen("input.txt", "r");
if (pFile == NULL){
printf("file failed to open\n");
return -1;
}
while((fgets(buffer, 20, pFile)) != NULL){ //store all the sums (calculated frequncies induced by changes) in an array called list
sum += atoi(buffer);
*plist = sum;
++plist;
++len;
}
fclose(pFile);
pFile = NULL;
plist = list;
printf("length is %d\n\n", len);
//below will now iterate through the loop and treat it as circular, so up to the element before current element
for(int i = 0; i < len && val == 0; ++i){
for(int j = i + 1; j < len + i; ++j){
if (j >= len)
q = abs(len - j);
else
q = j;
printf("here is i: %d\there is j: %d\n", list[i], list[q]);
if(list[i] == list[q]){
val = list[i];
break;
}
}
}
printf("the first frequency is %d\n", val);
getchar();
return 0;
}
答案 0 :(得分:0)
您的代码存在一些问题。最重要的是,您只需要遍历一次频率变化列表,而即使任务描述也提到您可能需要多次进行。一种解决方案是将更改文件读入数组,然后通过从初始频率= 0开始应用1st几次,以总和创建第二个数组(与现在一样)。此外,还应插入初始化后的sum数组。开头为0元素,即开始频率。
我不知道您的输入文件格式,因此您需要检查它是否按预期读取。但是,我用list
数组测试了代码的第二部分(双循环),该数组初始化为+ 1,-1和+ 3,+ 3,+ 4,-2,-4求和序列(后者重复了两次),效果很好。
要考虑的另外两个更改:
val == 0
用作循环停止条件;如果重复值为0,则循环将遍历所有元素。相反,请考虑使用标志(例如布尔变量)退出内部和外部循环。希望有帮助。