# How Many Zeros And Digits/임인택

## `~cpp MyTest.java`¶

```~cpp
import junit.framework.TestCase;

public class MyTest extends TestCase {
private HowManyZerosAndDigits object;

public void testFactorial() {
object = new HowManyZerosAndDigits(0, 0);
assertEquals(1, object.factorial(1));
assertEquals(2, object.factorial(2));
assertEquals(6, object.factorial(3));
assertEquals(24, object.factorial(4));
}

public void testHowManyZeros() {
object = new HowManyZerosAndDigits(0, 0);
assertEquals(0, object.howManyZeros(1));
assertEquals(1, object.howManyZeros(10));
assertEquals(2, object.howManyZeros(100));
assertEquals(2, object.howManyZeros(1010));
}

public void testNumberSystemConversion() {
//        object = new HowManyZerosAndDigits(120, 16);
//        assertEquals(2, object.convertNumber());
//
//        object = new HowManyZerosAndDigits(120, 10);
//        assertEquals(3, object.convertNumber());
}
}
```

## `~cpp HowManyZerosAndDigits.java `¶

```~cpp

public class HowManyZerosAndDigits {
private int _n;
private int _b;
private int _fact;

public HowManyZerosAndDigits(int n, int b) {
_n = n;
_b = b;
numbers = new LinkedList();
}

public void solve() {
_fact = factorial(_n);
convertNumber();
System.out.println(howManyZeros() + " " + numDigit());
}

public int factorial(int n) {
int result = 1;
for(int i=1; i<n+1; ++i) {
result = result*i;
}
return result;
}

public void convertNumber() {
if( _b == 10 )
return;

int quotient = _fact / _b;
int remainder = _fact % _b;

if( remainder != 0 )

while( quotient != 0 ) {
remainder = quotient % _b;
quotient = quotient / _b;
if( !(quotient==0 && remainder==0)) // 제일 상위자리가 0인 경우는 넣지 않는다.
}
}

public int howManyZeros(long num) {
int count = 0;
String number = Long.toString(num);

for(int i=0; i<number.length(); ++i) {
if( number.charAt(i)== '0' )
++count;
}
return count;
}

public int howManyZeros() {
if( _b == 10 ) {
return howManyZeros((long)_fact);
}
else {
int count = 0;
Object arr[] = numbers.toArray();
for(int i=0; i<arr.length; ++i) {
Long l = (Long)arr[i];
count += howManyZeros(l.longValue());
}
return count;
}
}

public int numDigit() {
if( _b == 10 ) {
int count = 1, value = _fact;
value = value/_b;

while( value != 0 ) {
value = value/_b;
++count;
}
return count;
} else {
return numbers.size();
}
}

public static void main(String args[]) {
try {
int n = readInt();
int b = readInt();
HowManyZerosAndDigits h = new HowManyZerosAndDigits(n, b);
h.solve();

} catch(Exception ex) {
ex.printStackTrace();
}
}
public static int readInt() throws Exception {
return Integer.parseInt(intVal);
}
}
```