坚持这个C代码

时间:2016-10-02 19:06:05

标签: c unix

好的,所以这段代码的目的是提示用户输入整数 程序将打印出每个数字0-9及其在用户提供的数字中的出现次数。 输出应该看起来像这样

Enter a number: 28666

0 is repeated 0 times.
1 is repeated 0 times.
2 is repeated 1 times.
3 is repeated 0 times.
4 is repeated 0 times.
5 is repeated 0 times.
6 is repeated 3 times.
7 is repeated 0 times.
8 is repeated 1 times.
9 is repeated 0 times.

这是我目前的代码和输出。

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

int main(void)
{ 
    bool digit_seen[10] = {false};
    int digit;
    long n;


    printf("Enter a number: ");
    scanf("%ld", &n);
    while (n > 0) {
      digit = n % 10;
      if (digit_seen[digit])
        break;
      digit_seen[digit] = true;
      n /= 10;
    }

    if (n > 0)
      for(int i=0; i<digit; i++)
        digit_seen[i]++;
      for(int i=0; i<digit; i++)
        printf(" %d is occur %d times \n",i,digit_seen[i]);
    if (n < 0)
      printf("No repeated digit\n");
    return 0;
}

这是我的输出

Enter a number: 147795655                                                                                                                                       
 0 is occur 1 times                                                                                                                                             
 1 is occur 1 times                                                                                                                                             
 2 is occur 1 times                                                                                                                                             
 3 is occur 1 times                                                                                                                                             
 4 is occur 1 times  

你可以看到我没有得到我需要的输出而且我不明白为什么。如果有人能帮助我理解我出错的地方那将是一个很大的帮助,谢谢。

4 个答案:

答案 0 :(得分:3)

您使用bool值来存储哪些数字存在或哪些数字不存在,但如果您想要计算每个数字的次数,则需要使用int代替bool

因此,将digit_seen定义为:

int digit_seen[10] = {0};

然后更改循环,在其中计算数字的no:

while (n > 0) {
    digit = n % 10;
    digit_seen[digit]++;
    n /= 10;
}

然后,你可以像这样打印digit_seen数组:

for (int i = 0; i < 10; i++){
    printf(" %d is occur %d times \n",i,digit_seen[i]);
}

修改

请参阅suggested code in action here

答案 1 :(得分:0)

你需要两个循环 - 一个用于计数,一个用于打印计数。

由于您的预期输出列出所有数字,因此您不需要单独的digit_seen循环。您可以简单地使用n%10n/10来分解数字,并按照您的方式增加digit_count[digit]。你需要为零添加一个特殊情况,因为这是你的循环退出条件。

答案 2 :(得分:0)

在两个

for(int i=0; i<digit; i++) 

数字只是while循环中的最后一个值,因此,数字的第一个数字。同样,来自while的n值将始终为0,因此永远不要进入

 if (n > 0)
  for(int i=0; i<digit; i++)
    digit_seen[i]++;

中没有

 if (n < 0)
  printf("No repeated digit\n");

所以只需进入

 for(int i=0; i<digit; i++)
   printf(" %d is occur %d times \n",i,digit_seen[i]);

然后显示原始n编号中是否存在数字,如结果所示。    您应该检查您的算法。

答案 3 :(得分:0)

你的主要错误是你试图增加一个布尔数组的元素“bool digit_seen [10]”。 你为什么不试试这个:

  • 声明用零初始化的整数数组[10]。数组的每个索引都代表一个数字,其值代表其频率。
  • 在while循环的每次迭代中, digit = n%10 然后 n = n / 10
  • 每次执行此操作时,请将数组中的相应值增加一(例如 array [digit] ++ )。
  • 然后你所要做的就是打印出相应数字的频率(也就是数组索引)。