【问题标题】:C Function: Count the occurrences of a digit in an integer [closed]C函数:计算整数中数字的出现次数[关闭]
【发布时间】:2018-06-27 21:02:27
【问题描述】:

我收到Output: 1. 我应该计算一个数字在整数中出现的次数,例如对于数字1222345n = 2 应该出现3 次。

int countOccurrences(int n, int num)
{
    int i,k;

    i=0;
    while(num!=0)
    {

        k=num%10;
        num=num/10;
        if(k==n)
        {
            i++;
        }
    }
}

// Main
void main()
{
    int num= 1222345;
    int n = 2;
    printf("Occurance of a number: %d", countOccurrences(n,num));
}

【问题讨论】:

  • 你的意思是计算一个 digit 出现在一个整数中的次数,对吧?您的函数不返回任何内容。它需要一个return 声明来表明您要返回的内容!
  • 请努力格式化您的代码
  • 这就是格式化的方式。
  • @kai11 num = 0n = 0 时应该打印什么代码?
  • 您似乎忘记启用编译器警告,告诉您countOccurrences() 中没有return 语句。

标签: c count numbers integer frequency


【解决方案1】:

正如其他人指出的那样,您的代码存在重要问题。

这是一个您可能会感兴趣的递归解决方案:

int countOccurrences(int n, int num)
{
    int count = ((num % 10) == n);

    return (num < 10) ? count : count + countOccurrences(n, num / 10);
}

关于您的代码的一些一般性评论:

  • 使用printf()时,应#include &lt;stdio.h&gt;
  • main() 应该返回 int
  • 在运算符周围放置空格并一致地格式化您的代码。这个k = num % 10;k=num%10; 更具可读性。 (代码格式不仅仅是品味问题;没有空格,您会创建充满字符的区域,这些字符对于我们的视觉系统来说更难解析。)

【讨论】:

  • 更简单的终止于num == 0,那么它只是return num ? (num%10==n) + countOccurrences(n, num/10) : 0;
  • @TobySpeight 非常好!它会改变行为,尽管 (0, 0) 会返回 0,而不是像现在这样返回 1。由于0 是一个有一位数的整数,它不再是正确的。
  • 哦,是的,我确实忘记了 (0,0) 的边缘情况。我可以声称这是因为缺少单元测试吗? (嗯,值得一试……)
【解决方案2】:

您在代码中有未定义的行为。该函数应该返回一个int,但它没有。

解决方法是在其他函数末尾添加return i。这会给你正确的结果。在countOccurrences()函数中

...
    if(k==n)
    {
        i++;
    }
  }
  return i;
}

我跳过了关于错误检查等的讨论。正如chux 提到的n&lt;=0 案例,您可能想要添加一种不同的处理方式,但您没有添加它。至少考虑这些情况并在您需要的任何输入上添加错误消息。

一些极端情况是

  • n=0,m=0
  • nm 的负值。

【讨论】:

  • OP 的代码在 num &lt;= 0 时也会丢失 - 但可能不在乎。
  • @chux.: 嗯,是的..注意点。
【解决方案3】:

请在您的 countOccurrences 函数中添加 return

int countOccurrences (int n, int num) {

int i, k;
i = 0;
while (num! = 0)
{

     k = num% 10;
     num = num / 10;
     if (k == n)
     {
         i ++;
     }
}

return i; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2021-07-06
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多