面试题-判断无限循环小数 发表于 2019-08-06 | 题目:正整数A、B,判断A/B是否为无限循环小数,若是,找出循环部分。如1/7,循环部分为142857。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394/* * 判断两数相除是否为无限循环小数,如果是,找出循环的部分 */public class RepeatDecimal{ private int _dividend; private int _divider; public RepeatDecimal(int dividend, int divider) { _dividend = dividend; _divider = divider; } /* * 判断是否为无限循环小数 */ public bool IsRpeatDecimal() { // 分子为0 if (_dividend == 0) return false; // 分母为0 if (_divider == 0) throw new Exception("Divider is zero"); // 先找到最大公约数,化为最简分数 var gcd = getGCD(); int tmp = _divider / gcd; // 分母存在2、5以外的因数,则无限循环 while (tmp % 2 == 0) tmp /= 2; while (tmp % 5 == 0) tmp /= 5; return tmp != 1; } /* * 获取循环部分 */ public string GetRepeatPart() { if (!IsRpeatDecimal()) return null; string result = ""; var a = Math.Abs(_dividend); var b = Math.Abs(_divider); // 模拟除法 List<int> decimals = new List<int>(); while (a > b) a -= b; while (true) { while (a < b) { a *= 10; } // 如果商之前得到过,则找到了循环部分 int quotient = a / b; int index = decimals.IndexOf(quotient); if (index >= 0) { for (var i = index; i < decimals.Count; ++i) { result += decimals[i]; } break; } else { decimals.Add(quotient); } a %= b; } return result; } private int getGCD() { int a = _dividend; int b = _divider; int c = 0; while (true) { c = a % b; a = b; b = c; if (b == 0) { return a; } } }}