给定一个非负整数int n,则递归计算(无循环),将8的出现次数计数为一个数字,除了8紧接其左边的8计数为两倍,因此8818产生4。请注意,mod(%)除以10将产生最右边的数字(126%10为6),而除以(/)除以10将除去最右边的数字(126/10为12)。

count8(8) → 1
count8(818) → 2
count8(8818) → 4


我的程序似乎无法计算双'8'。这是代码。

public int count8(int n) {
    boolean flag = false;
    if(n<10)
    {
      if (n==8)
      {
         if(flag == true)
             return 2;
         else
         {
             flag = true;
             return 1;
         }
      }
      else
      {
        flag = false;
        return 0;
      }
    }

    else
       return count8(n%10)+count8(n/10);

}


我想知道最后一行是否出错,但是我不知道如何检查。期待您的帮助。谢谢!

最佳答案

将状态(前一位数字为8)传递给方法:

private static int count8(int n, boolean eight) {
  if (n <= 0)
    return 0;
  else if (n % 10 == 8)
    return 1 + (eight ? 1 : 0) + count8(n / 10, true);
  else
    return count8(n / 10, false);
}

public static int count8(int n) {
  return count8(n, false);
}

08-27 15:47