给定非负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);
}
我想知道最后一行是否出错,但我不知道如何检查。期待您的帮助。谢谢!
答案 0 :(得分:1)
将状态(前一个数字 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);
}
答案 1 :(得分:1)
您的标志变量仅为本地变量。只有一次你阅读它:if (flag == true)
并且因为在此之前你永远不会改变它的值,它总是错误的。
你使这比现在复杂得多。根本不需要额外的参数。
public int count8(int n)
{
if (n % 100 == 88) return count8(n/10) + 2;
if (n % 10 == 8) return count8(n/10) + 1;
if (n < 10) return 0;
return count8(n/10);
}
答案 2 :(得分:0)
你可以尝试这样的smth:
public int count8(int n) {
if (n < 10)
return n == 8: 1 ? 0;
int count = 0;
String num = Integer.toString(n);
int numLength = num.length();
if (numLength % 2 != 0)
num += "0";
if ((num.charAt(numLength / 2) == num.charAt(numLength / 2 - 1)) && (num.charAt(numLength / 2) == "8"))
count++;
String left = num.substring(0, numLength / 2);
int leftInt = Integer.parseInt(left);
String rigth = num.substring(numLength / 2);
int rigthInt = Integer.parseInt(rigth);
return count + count8(leftInt) + count8(rigthInt);
}
答案 3 :(得分:0)
C ++
int count8(int n) {
return n == 0 ? 0 : (n % 10 == 8) + (n % 100 == 88) + count8(n/10);
}
Java和C#
int count8(int n) {
if (n==0) return 0;
if(n % 100 == 88)
return 2 + count8(n / 10);
if(n % 10 == 8)
return 1 + count8(n / 10);
return count8(n / 10);
}