Problem:
Score : 300 points

Problem Statement

You are given an integer N.

For two positive integers A and B, we will define F(A,B) as the larger of the following: the number of digits in the decimal notation of A, and the number of digits in the decimal notation of B.

For example, F(3,11) = 2 since 3 has one digit and 11 has two digits.

Find the minimum value of F(A,B) as (A,B) ranges over all pairs of positive integers such that N = A \times B.

Constraints

1 \leq N \leq 10^{10}

N is an integer.

Input

The input is given from Standard Input in the following format:

N

Output

Print the minimum value of F(A,B) as (A,B) ranges over all pairs of positive integers such that N = A \times B.

Sample Input 1

10000

Sample Output 1

3

F(A,B) has a minimum value of 3 at (A,B)=(100,100).

Sample Input 2

1000003

Sample Output 2

7

There are two pairs (A,B) that satisfy the condition: (1,1000003) and (1000003,1). For these pairs, F(1,1000003)=F(1000003,1)=7.

Sample Input 3

9876543210

Sample Output 3

6

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<cstdio>
#include<bits/stdc++.h>
typedef long long int ll;
#define REP(i, n) for(int i = 0; i < (n); i++)
#define FOR_IN(i, a, b) for(int i = (a); i < (b); i++)
#define BETWEEN(x, a, b) ((x) >= (a) && (x) <= (b))
#define LOG(...) fprintf(stderr, __VA_ARGS__)
using namespace std;

/*
n
 */
ll n;
vector<int> primes; //list of prime numbers
vector<int> np; //exponent
bool not_prime[100000];

int main(){
  cin >> n;

  FOR_IN(i,2,sqrt(n)){
    if(not_prime[i]) continue;
    primes.push_back(i);

    int cnt = 0;
    while(!(n%i)){
      n /= i;
      cnt++;
    }
    np.push_back(cnt);

    for(int j = i; j <= sqrt(n); j += i)
      not_prime[j] = true;
  }
  if(n > 1){
    primes.push_back(n);
    np.push_back(1);
  }

  ll a = 1, b = 1;
  for(int i = primes.size() - 1; i >= 0; i--){
    int p = primes[i];
    int num = np[i];
    REP(j, num){
      if(a < b) a *= p;
      else b *= p;
    }
  }

  LOG("a = %lld, b = %lld\n", a, b);

  cout << floor(log10(max(a,b)))+1 << endl;

  return 0;
}