一道求循环小数的程序员笔试题

  题目是这样的:求两个数相除的商,并计算出小数点后的循环部分。例如1/3 商为0.333333333... ,则表示为0.(3)。

  此题的关键是怎么判断商循环小数以及得到其循环部分。其实就是一个很简单的数学知识,如果两数相除,出现了两次相同的余数,则循环发生。

  C#代码如下,其原理就是余数乘10再除以除数,若出现两次相同的余数,则可得到循环部分。

using System; using System.Collections.Generic; using System.Text; namespace XunHuan { class XunHuanCalculator { private int _nFenZi; private int _nFenMu; private int[] _narrYuShu; private int[] _narrShang; int _nIndex; public XunHuanCalculator(int nfz, int nfm) { _nFenZi = nfz; _nFenMu = nfm; // 这里定义存储商和余数的数组大小为100 // 意味着小数点后面100位之前肯定发生了循环 // 其实是不严谨的 // 由于题目默认是求循环小数,所以就这样吧,嘿嘿 _narrYuShu = new int[100]; _narrShang = new int[100]; _nIndex = 0; } private int Check(int nIndex,int ncurYuShu) { int i; for (i = 0; i < nIndex;i++ ) { if (_narrYuShu[i] == ncurYuShu) return i; } return -1; } public void GetResult() { // 如果可以被整除 if (_nFenZi % _nFenMu == 0) { Console.WriteLine("{0}", _nFenZi / _nFenMu); return; } // 不能被整除 // 则先输出整数部分 Console.Write("{0}.", _nFenZi / _nFenMu); int nYuShu; nYuShu = _nFenZi % _nFenMu; _narrYuShu[_nIndex] = nYuShu; while (true) { if (nYuShu < _nFenMu) nYuShu *= 10; _narrShang[_nIndex] = nYuShu / _nFenMu; _narrYuShu[++_nIndex] = nYuShu % _nFenMu; nYuShu %= _nFenMu; // 检查余数是否出现过 int ncheck = Check(_nIndex, nYuShu % _nFenMu); if (ncheck!=-1) { for (int j = 0; j < ncheck;j++ ) { Console.Write("{0}", _narrShang[j]); } Console.Write("("); for (int j=ncheck;j<_nIndex;j++) { Console.Write("{0}", _narrShang[j]); } Console.WriteLine(")"); break; } } } } class Program { static void Main(string[] args) { XunHuanCalculator xhCal = new XunHuanCalculator(124, 999); xhCal.GetResult(); Console.ReadLine(); } } }

你可能感兴趣的:(算法,class,string,c#,存储)