This solution gets "Wrong answer" result inhttp://www.programming-challenges.com/,
but it gets "Accepted" result inhttp://uva.onlinejudge.org/.
I don't know why so far.
#include <vector>
#include <iostream>
using namespace std;
static int s_Multiplier[] = {0, 1, 0, 7, 0, 0, 0, 3, 0, 9};
static void Multiply(int src, int multiplier, int& result, int& flag)
{
result = src * multiplier + flag;
flag = result / 10;
result %= 10;
}
static void Add(int a, int b, int& result, int& flag)
{
result = a + b + flag;
flag = result / 10;
result %= 10;
}
static void Multiply(const vector<int>& data, int multiplier, vector<int>& dest)
{
int len = data.size();
int result, flag = 0;
for (int i = 0; i < len; ++i)
{
Multiply(data[i], multiplier, result, flag);
dest.push_back(result);
}
if (flag > 0)
dest.push_back(flag);
}
static void Add(const vector<int>& adder, vector<int>& dest, int startIndex)
{
int adderLen = adder.size();
int result, flag = 0;
int destLen = dest.size() - startIndex;
for (int i = 0; i < adderLen; ++i)
{
if (destLen <= i)
{
Add(adder[i], 0, result, flag);
dest.push_back(result);
}
else
{
Add(adder[i], dest[startIndex + i], result, flag);
dest[startIndex + i] = result;
}
}
destLen = dest.size() - startIndex;
for (int i = adderLen; i < destLen; ++i)
{
Add(0, dest[destLen + i], result, flag);
dest[destLen + i] = result;
}
if (flag > 0)
dest.push_back(flag);
}
static int GetMultiplier(int number, int target)
{
return (s_Multiplier[number] * target) % 10;
}
static void FromIntToVector(int n, vector<int>& data)
{
while(n > 0)
{
data.push_back(n % 10);
n /= 10;
}
}
static bool IsOnes(const vector<int>& data, int startIndex)
{
int len = data.size();
if (len <= startIndex)
return false;
for (int i = startIndex; i < len; ++i)
{
if (data[i] != 1)
return false;
}
return true;
}
static int GetTarget(int number)
{
if (number <= 1)
return 1 - number;
return 11 - number;
}
static int GetOnes(int n)
{
vector<int> src;
FromIntToVector(n, src);
if (IsOnes(src, 0))
return src.size();
int target = 1;
vector<int> data, temp;
int startIndex = 1;
while(true)
{
int multiplier = GetMultiplier(src[0], target);
temp.clear();
Multiply(src, multiplier, temp);
Add(temp, data, startIndex - 1);
if (IsOnes(data, startIndex))
break;
target = GetTarget(data[startIndex]);
++startIndex;
}
return data.size();
}
static void Test()
{
int n;
while(cin >> n)
cout << GetOnes(n) << endl;
}
int main(int argc, char* argv[])
{
Test();
return 0;
}