95 lines
3.4 KiB
C#
95 lines
3.4 KiB
C#
using System;
|
|
|
|
namespace FractionReduction {
|
|
class Program {
|
|
static int IndexOf(int n, int[] s) {
|
|
for (int i = 0; i < s.Length; i++) {
|
|
if (s[i] == n) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static bool GetDigits(int n, int le, int[] digits) {
|
|
while (n > 0) {
|
|
var r = n % 10;
|
|
if (r == 0 || IndexOf(r, digits) >= 0) {
|
|
return false;
|
|
}
|
|
le--;
|
|
digits[le] = r;
|
|
n /= 10;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static int RemoveDigit(int[] digits, int le, int idx) {
|
|
int[] pows = { 1, 10, 100, 1000, 10000 };
|
|
|
|
var sum = 0;
|
|
var pow = pows[le - 2];
|
|
for (int i = 0; i < le; i++) {
|
|
if (i == idx) continue;
|
|
sum += digits[i] * pow;
|
|
pow /= 10;
|
|
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
static void Main() {
|
|
var lims = new int[,] { { 12, 97 }, { 123, 986 }, { 1234, 9875 }, { 12345, 98764 } };
|
|
var count = new int[5];
|
|
var omitted = new int[5, 10];
|
|
var upperBound = lims.GetLength(0);
|
|
for (int i = 0; i < upperBound; i++) {
|
|
var nDigits = new int[i + 2];
|
|
var dDigits = new int[i + 2];
|
|
var blank = new int[i + 2];
|
|
for (int n = lims[i, 0]; n <= lims[i, 1]; n++) {
|
|
blank.CopyTo(nDigits, 0);
|
|
var nOk = GetDigits(n, i + 2, nDigits);
|
|
if (!nOk) {
|
|
continue;
|
|
}
|
|
for (int d = n + 1; d <= lims[i, 1] + 1; d++) {
|
|
blank.CopyTo(dDigits, 0);
|
|
var dOk = GetDigits(d, i + 2, dDigits);
|
|
if (!dOk) {
|
|
continue;
|
|
}
|
|
for (int nix = 0; nix < nDigits.Length; nix++) {
|
|
var digit = nDigits[nix];
|
|
var dix = IndexOf(digit, dDigits);
|
|
if (dix >= 0) {
|
|
var rn = RemoveDigit(nDigits, i + 2, nix);
|
|
var rd = RemoveDigit(dDigits, i + 2, dix);
|
|
if ((double)n / d == (double)rn / rd) {
|
|
count[i]++;
|
|
omitted[i, digit]++;
|
|
if (count[i] <= 12) {
|
|
Console.WriteLine("{0}/{1} = {2}/{3} by omitting {4}'s", n, d, rn, rd, digit);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Console.WriteLine();
|
|
}
|
|
|
|
for (int i = 2; i <= 5; i++) {
|
|
Console.WriteLine("There are {0} {1}-digit fractions of which:", count[i - 2], i);
|
|
for (int j = 1; j <= 9; j++) {
|
|
if (omitted[i - 2, j] == 0) {
|
|
continue;
|
|
}
|
|
Console.WriteLine("{0,6} have {1}'s omitted", omitted[i - 2, j], j);
|
|
}
|
|
Console.WriteLine();
|
|
}
|
|
}
|
|
}
|
|
}
|