计算相邻整数的总数

时间:2016-01-24 22:34:46

标签: c algorithm

我想从文件中逐行计算排除重复的整数数。

我想要的输出是:

Duplicates : 9
Duplicates : 4
Duplicates : 5
Duplicates : 5
Duplicates : 1
Duplicates : 1
Duplicates : 8

有关概念的进一步说明: 取文件的第二行:

1 2 3 4 5 6 5 4 5

在这一行,计数器增加1,因为首先找到1。 接下来是2,2不是1所以增加计数器。接下来是3,3不是2所以递增计数器。接下来是一个4,4不是3所以递增计数器。接下来是一个5,5不是4所以递增计数器。接下来是一个6,6,这不是一个5增加计数器。接下来是一个5,5不是6所以递增计数器。接下来是一个4,4不是5所以递增计数器。接下来是一个5,5不是4所以递增计数器。不包括重复的整数数是9。

另一个例子: 看一下文件的第8行:

34 34 34 34 34

在这一行,有一个34增加计数器。接下来是34,34是34所以不要增加计数器。接下来是34,34是34所以不要增加计数器。接下来是34,34是34所以不要增加计数器。接下来是34,34是34所以不要增加计数器。不包括重复的整数数是1.

编辑: 我在这里接受了用户的建议,并查看了与相邻字符串和整数相关的一些链接。与我上面列出的所需输出相比,输出现在几乎完全正确。我只会将相关代码放在下面:

输出:

check1:1
check1:1
check1:2
Duplicates : 6   (Wrong value)
check1:2
Duplicates : 5   (Wrong value)
Duplicates : 5
Duplicates : 5
check1:0
check1:0
check1:0
check1:0
Duplicates : 1
Duplicates : 1
check1:0
check1:0
check1:2
check1:3
check1:3
check1:3
check1:4
check1:5
check1:5
check1:5
check1:5
check1:6
check1:6
Duplicates : 7  (Wrong value)

从输出看来,只要测试用例通过if语句if(array[check] == ch),输出就不正确。

我一直盯着这个功能的循环很长时间,我仍然难倒。 有关为什么循环导致错误值的任何建议?谢谢。

3 个答案:

答案 0 :(得分:2)

你的逻辑太复杂了,这个简单的逻辑应该这样做

  1. 计算第一个值
  2. 从第二个值开始循环到最后一个
  3. 从前一个减去当前值,如果结果为0,那么它的值相同,不要添加到计数器,否则添加到计数器。
  4. 我写了一个程序来向你展示如何

    <强> numbers.txt

    1 2 3 4 5 6 5 4 5
    14 62 48 14
    1 3 5 7 9
    123 456 789 1234 5678
    34 34 34 34 34
    1
    1 2 2 2 2 2 3 3 4 4 4 4 5 5 6 7 7 7 1 1
    

    <强> program.c

    #include <stdlib.h>
    #include <stdio.h>
    
    int
    main(int argc, char **argv)
    {
        FILE *file;
        char line[100];
    
        file = fopen("numbers.txt", "r");
        if (file == NULL)
            return -1;
        while (fgets(line, sizeof(line), file) != NULL)
        {
            char *start;
            int array[100];
            int count;
            int value;
            int step;
    
            count = 0;
            start = line;
            while (sscanf(start, "%d%n", array + count, &step) == 1)
            {
                start += step;
                count += 1;
            }
    
            fprintf(stderr, "%d ", array[0]);
            value = 1;
            for (int i = 1 ; i < count ; ++i)
            {
                value += (array[i] - array[i - 1]) ? 1 : 0;
                fprintf(stderr, "%d ", array[i]);
            }
            fprintf(stderr, " -- %d\n", value);
        }
        fclose(file);
    
        return 0;
    }
    

答案 1 :(得分:1)

你只需要将当前值检查到数组的先前值并检查它们是否相等或类似这样的内容::

int ans = 1;
for (int i = 1 ; i < n ; i++) { //n is the number of elements in array
    if (a[i] != a[i - 1]) {
        ans++;
    }
}
printf("%d", ans);

我不完全理解为什么在代码中使用这么多check。我在这段代码中做的是检查数组中的当前元素(从1开始)并将其与前一个元素进行比较,因此如果它们不相等,则在数组中有一个唯一元素(顺序),因此我按顺序递增ans,这是唯一元素的数量。

这里我从ans = 1开始,因为我假设你的数组中至少有一个元素,并且在任何情况下都是唯一的。

答案 2 :(得分:1)

我不知道你在使用那么多代码。 但是对于我理解你想做的事情,这是一个简单的循环:

#include <stdio.h>

int main() {
    int array[] = {1,3,5,7,9};
    int count = 1;
    int i = 0;

    for(i=1; i<(sizeof(array)/sizeof(array[0])); i++) { //sizeof(array)/sizeof(array[0]) calculates the length of the array
        if(array[i]!=array[i-1]) {
            count++;
        }
    }
    printf("%d", count);
}