递归计算给定数字中数字 8 的出现次数
Recursively count the occurences of 8 as a digit in a given number
给定一个非负整数 n,递归地(无循环)计算 8 作为数字出现的次数,除了一个 8 和另一个紧邻其左边的 8 计数加倍,所以 8818 产生 4。注意mod (%) 除以 10 得到最右边的数字(126 % 10 是 6),而除以 (/) 除以 10 会删除最右边的数字(126 / 10 是 12)。
我试过了,我的代码在下面。还请让我知道我在代码中做错了什么。提前谢谢了!!忽略 main()。
计数 8(8) → 1
计数 8(818) → 2
count8(8818) → 4
public int count8(int n) {
int cd=0,pd=0,c=0; // cd for current digit, pd for previous digit,c=count
if(n==0) // base condition
return 0;
cd = n%10; // finding the rightmost digit
if(cd==8)// if rightmost digit id 8 then
{
c++;
n=n/10;// moving towards left from rightmost digit
if(n!=0)
pd=n%10;//second rightmost digit(similarly as secondlast digit)
if(cd==8 && pd==8)// if rightmost and second rightmost equals 8, double c
c=c*2;
}
else // if cd not equals 8 then
c=0;
return c + count8(n/10);//adding count and recursively calling method
}
Expected Run
count8(8) → 1 1 OK
count8(818) → 2 2 OK
count8(8818) → 4 3 X
count8(8088) → 4 3 X
count8(123) → 0 0 OK
count8(81238) → 2 2 OK
count8(88788) → 6 4 X
count8(8234) → 1 1 OK
count8(2348) → 1 1 OK
count8(23884) → 3 2 X
count8(0) → 0 0 OK
count8(1818188) → 5 4 X
count8(8818181) → 5 4 X
count8(1080) → 1 1 OK
count8(188) → 3 2 X
count8(88888) → 9 5 X
count8(9898) → 2 2 OK
count8(78) → 1 1 OK
我会再简化一点
public int count8(int number, bool prevWas8 = false)
{
int num8s = 0;
if( number == 0) //base case
return 0;
if( number%10 == 8) //we found an 8!
num8s++;
if (prevWas8 && num8s > 0) // we found two 8's in a row!
num8s++;
return num8s + count8(number/10, num8s>0);
}
public int count8(int n)
{
if(n == 0)
return 0;
if(n % 10 == 8)
{
if(n / 10 % 10 == 8)
return 2+count8(n/10);
return 1+count8(n/10);
}
return count8(n/10);
}
public int count8(int n) {
int c=0;
if (n==0){
return 0;
}
else{
if (n%10==8 && (n/10)%10==8){
c+=2;
}
else if (n%10==8 && (n/10)%10!=8){
c++;
}
}
return c+count8(n/10);
}
如果你想要简单:
public int count8(int n) {
return (n < 8) ? 0 : ((n % 10 == 8) ? ((n % 100 == 88) ? 2 : 1) : 0) + count8(n / 10);
}
给定一个非负整数 n,递归地(无循环)计算 8 作为数字出现的次数,除了一个 8 和另一个紧邻其左边的 8 计数加倍,所以 8818 产生 4。注意mod (%) 除以 10 得到最右边的数字(126 % 10 是 6),而除以 (/) 除以 10 会删除最右边的数字(126 / 10 是 12)。
我试过了,我的代码在下面。还请让我知道我在代码中做错了什么。提前谢谢了!!忽略 main()。
计数 8(8) → 1
计数 8(818) → 2
count8(8818) → 4
public int count8(int n) {
int cd=0,pd=0,c=0; // cd for current digit, pd for previous digit,c=count
if(n==0) // base condition
return 0;
cd = n%10; // finding the rightmost digit
if(cd==8)// if rightmost digit id 8 then
{
c++;
n=n/10;// moving towards left from rightmost digit
if(n!=0)
pd=n%10;//second rightmost digit(similarly as secondlast digit)
if(cd==8 && pd==8)// if rightmost and second rightmost equals 8, double c
c=c*2;
}
else // if cd not equals 8 then
c=0;
return c + count8(n/10);//adding count and recursively calling method
}
Expected Run
count8(8) → 1 1 OK
count8(818) → 2 2 OK
count8(8818) → 4 3 X
count8(8088) → 4 3 X
count8(123) → 0 0 OK
count8(81238) → 2 2 OK
count8(88788) → 6 4 X
count8(8234) → 1 1 OK
count8(2348) → 1 1 OK
count8(23884) → 3 2 X
count8(0) → 0 0 OK
count8(1818188) → 5 4 X
count8(8818181) → 5 4 X
count8(1080) → 1 1 OK
count8(188) → 3 2 X
count8(88888) → 9 5 X
count8(9898) → 2 2 OK
count8(78) → 1 1 OK
我会再简化一点
public int count8(int number, bool prevWas8 = false)
{
int num8s = 0;
if( number == 0) //base case
return 0;
if( number%10 == 8) //we found an 8!
num8s++;
if (prevWas8 && num8s > 0) // we found two 8's in a row!
num8s++;
return num8s + count8(number/10, num8s>0);
}
public int count8(int n)
{
if(n == 0)
return 0;
if(n % 10 == 8)
{
if(n / 10 % 10 == 8)
return 2+count8(n/10);
return 1+count8(n/10);
}
return count8(n/10);
}
public int count8(int n) {
int c=0;
if (n==0){
return 0;
}
else{
if (n%10==8 && (n/10)%10==8){
c+=2;
}
else if (n%10==8 && (n/10)%10!=8){
c++;
}
}
return c+count8(n/10);
}
如果你想要简单:
public int count8(int n) {
return (n < 8) ? 0 : ((n % 10 == 8) ? ((n % 100 == 88) ? 2 : 1) : 0) + count8(n / 10);
}