问题是显示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
}
(一旦你完成了这项工作,你就可以简化
if
s。如果你把这两个测试结合起来,只需要一个。)你的第二个版本差不多了,但太复杂了。你需要做的就是:
每次你看到那个数字时在计数器上加一个
只有当计数器正好是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/