0

面试题-判断无限循环小数

 2 years ago
source link: https://rhetty.github.io/2019/08/06/%E9%9D%A2%E8%AF%95%E9%A2%98-%E5%88%A4%E6%96%AD%E6%97%A0%E9%99%90%E5%BE%AA%E7%8E%AF%E5%B0%8F%E6%95%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

面试题-判断无限循环小数

发表于 2019-08-06

  |  

题目:正整数A、B,判断A/B是否为无限循环小数,若是,找出循环部分。如1/7,循环部分为142857。

* 判断两数相除是否为无限循环小数,如果是,找出循环的部分
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;
decimals.Add(quotient);
a %= b;
return result;
private int getGCD()
int a = _dividend;
int b = _divider;
int c = 0;
while (true)
c = a % b;
if (b == 0)
return a;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK