在C中实现-代码的出现2018:第1_2天

时间:2019-04-29 17:07:18

标签: c

这是问题所在

  

您注意到设备重复了相同的频率更改列表   以上。要校准设备,您需要找到第一个   频率达到两倍。

     

例如,使用上面相同的更改列表,设备将   循环如下:

     
      
  • 当前频率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;
}

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。最重要的是,您只需要遍历一次频率变化列表,而即使任务描述也提到您可能需要多次进行。一种解决方案是将更改文件读入数组,然后通过从初始频率= 0开始应用1st几次,以总和创建第二个数组(与现在一样)。此外,还应插入初始化后的sum数组。开头为0元素,即开始频率。

我不知道您的输入文件格式,因此您需要检查它是否按预期读取。但是,我用list数组测试了代码的第二部分(双循环),该数组初始化为+ 1,-1和+ 3,+ 3,+ 4,-2,-4求和序列(后者重复了两次),效果很好。

要考虑的另外两个更改:

  • 请勿将val == 0用作循环停止条件;如果重复值为0,则循环将遍历所有元素。相反,请考虑使用标志(例如布尔变量)退出内部和外部循环。
  • 无需将循环作为循环进行处理,只需将当前元素与所有未来元素进行比较即可。

希望有帮助。