问题是显示C中重复的数字。
所以我写了这个:

#include<stdio.h>
#include<stdbool.h>

int main(void){

    bool number[10] = { false };
    int digit;
    long n;

    printf("Enter a number: ");
    scanf("%ld", &n);

    printf("Repeated digit(s): ");

    while (n > 0)
    {
        digit = n % 10;
        if (number[digit] == true)
        {
            printf("%d ", digit);
        }
        number[digit] = true;
        n /= 10;
    }

      return 0;
}

但它会一次又一次地显示重复的数字
(例如输入:55544输出:455)
我修改了它:
#include<stdio.h>

int main(void){

    int number[10] = { 0 };
    int digit;
    long n;

    printf("Enter a number: ");
    scanf("%ld", &n);

    printf("Repeated digit(s): ");

    while (n > 0)
    {
        digit = n % 10;
        if (number[digit] == 1)
        {
            printf("%d ", digit);
            number[digit] = 2;
        }
        else if (number[digit] == 2)
            break;
        else number[digit] = 1;

        n /= 10;
    }
    return 0;
}

它起作用了!
但是,我想知道如果我需要使用布尔值(true-false)或者更有效的方法,该怎么做?

最佳答案

要使第一个版本生效,您需要跟踪两件事:
你已经看到这个数字了吗?(检测重复项)
你已经打印出来了吗?(只输出一次重复项)
比如说:

bool seen[10] = { false };
bool output[10] = { false };

// [...]

  digit = ...;
  if (seen[digit]) {
    if (output[digit])) {
      // duplicate, but we already printed it
    } else {
      // need to print it and set output to true
    }
  } else {
    // set seen to true
  }

(一旦你完成了这项工作,你就可以简化ifs。如果你把这两个测试结合起来,只需要一个。)
你的第二个版本差不多了,但太复杂了。你需要做的就是:
每次你看到那个数字时在计数器上加一个
只有当计数器正好是2时才打印号码。
digit = ...;
counter[digit]++;
if (counter[digit] == 2) {
  // this is the second time we see this digit
  // so print it out
}
n = ...;

另一个好处是,你可以在最后得到每个数字的计数。

关于c - 如何显示在c中重复的数字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26571077/

10-10 18:23
查看更多