“Sharpen Up” Series: Episode 4
Continuing my “Sharpen Up” Series, herewith the next episode.
The problem is to find digits that:
- For an integer n, divide exactly into n;
- Also divide exactly into the sum of the digits of n.
For example, 3 divides exactly into 81 and also divides exactly into 8+1 = 9. Except that the problem gets harder–there’s a requirement to count the digits for a particular base numbering system for which this property holds. Using base 10, only 3 and 9 satisfy this property. The problem statement indicates that if a digit appears to be a candidate for all possible numbers with less than 4 digits of the relevant base, then it is deemed true for all numbers. The trivial cases of 0 and 1 should not be included in the count.
This problem took me 36 minutes to complete–here’s my solution:
using System.Collections.Generic;
// 4:30
// 5:06
// SRM150DIV1_250
public class InterestingDigits
{
private int[] num = new int[3];
public int[] digits(int Base)
{
List<int> interesting = new List<int>();
for (int d = 2; d < Base; d++)
{
for (int i = 0; i < 3; i++)
num[i] = 0;
num[0] = d;
bool exception = false;
while (true)
{
if (((num[0] + num[1] + num[2]) % d == 0 &&
(num[0] + num[1]*Base + num[2]*Base*Base) % d != 0) ||
((num[0] + num[1] + num[2]) % d != 0 &&
(num[0] + num[1]*Base + num[2]*Base*Base) % d == 0))
{
exception = true;
break;
}
if (++num[0] == Base)
{
num[0] = 0;
if (++num[1] == Base)
{
num[1] = 0;
if (++num[2] == Base)
{
break;
}
}
}
}
if (!exception)
{
interesting.Add(d);
}
}
return interesting.ToArray();
}
}
leave a comment