输出值重复

时间:2018-07-23 10:35:35

标签: c duplicates

我想按升序顺序显示日历数据。

如果该日期出现几次,则需要显示一次。 如果日期在输入中出现五次或少于五次,则代码有效, 如果日期在输出中出现五次以上,它将显示两次。

我没有看到错误。

#include <stdio.h>
#include <stdlib.h>

struct date {
  int zi;
  int luna;
};
int main() {

  int n, i, j, k = 0, l;
  char c;
  scanf("%d", &n);
  struct date v[100];
  for (i = 0; i < n; i++) {
    scanf("%d %c %d", &v[i].zi, &c, &v[i].luna);
  }

  for (i = 0; i < n - 1; i++) {
    for (j = i + 1; j < n; j++) {
      if (v[i].luna > v[j].luna) {
        struct date temp = v[i];
        v[i] = v[j];
        v[j] = temp;
      } else if (v[i].luna == v[j].luna && v[i].zi > v[j].zi) {
        struct date temp = v[i];
        v[i] = v[j];
        v[j] = temp;
      }
    }
  }

  printf("\n");
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (v[i].luna == v[j].luna && v[i].zi == v[j].zi && i != j) {
        printf("\nOK\n");
        for (l = j; l < n - 1; l++) {
          //    v[l].luna=v[l+1].luna;
          //    v[l].zi=v[l+1].zi;
          v[l] = v[l + 1];
        }
        n--;
      }
    }
  }
  for (i = 0; i < n; i++) {

    if (v[i].luna < 10 && v[i].zi >= 10) {

      printf("%d-0%d\n", v[i].zi, v[i].luna);
    } else if (v[i].zi < 10 && v[i].luna >= 10) {

      printf("0%d-%d\n", v[i].zi, v[i].luna);
    } else if (v[i].zi < 10 && v[i].luna < 10) {

      printf("0%d-0%d\n", v[i].zi, v[i].luna);
    } else
      printf("%d-%d\n", v[i].zi, v[i].luna);
  }
}

1 个答案:

答案 0 :(得分:0)

问题似乎出在此块上:

  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (v[i].luna == v[j].luna && v[i].zi == v[j].zi && i != j) {
        printf("\nOK\n");
        for (l = j; l < n - 1; l++) {
          //    v[l].luna=v[l+1].luna;
          //    v[l].zi=v[l+1].zi;
          v[l] = v[l + 1];
        }
        n--;
      }
    }
  }

当您删除重复项时(即,将所有元素移到起始位置并递减n),您仍会递增j。因此,您的循环将跳过一个元素,最终可能会重复。

该解决方案可以像减少j的同时减少n一样简单。

顺便说一句:j循环从零开始似乎很奇怪。我希望它从i+1

开始