频道栏目
首页 > 资讯 > C++ > 正文

[LeetCode] Fraction to Recurring Decimal

15-03-25        来源:[db:作者]  
收藏   我要投稿

 

Fraction to Recurring Decimal


Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.

If the fractional part is repeating, enclose the repeating part in parentheses.

For example,

  • Given numerator = 1, denominator = 2, return "0.5".
  • Given numerator = 2, denominator = 1, return "2".
  • Given numerator = 2, denominator = 3, return "0.(6)".

    题目意思:

    将分数转化成循环小数。大体思想是:用两个map分别记录商及其位置和余数及其位置,若出现了重复的余数,则表示此余数对应位置的商位开始循环。这道题非常多的陷阱。弄了我好久,代码如下所示

     

    class Solution {
    public:
    	string fractionToDecimal(int numerator, int denominator) {
    		string result = "";
    		long long numberatorL = (long long)numerator;
    		long long denominatorL = (long long)denominator;
    		if (numberatorL * denominatorL < 0){		//注意负数的情况
    			result += "-";
    			numberatorL = -numberatorL;
    		}
    		long long quotient = numberatorL / denominatorL;	//商
    		result += intToStr(quotient);
    		long long remainder = numberatorL % denominatorL;	//余数
    		if (remainder != 0){
    			result += '.';
    			int position = -1;
    			int repeatStartPosition = -1;		//循环起始位
    			map positionToQuotient;	//位置到商,从某个位置开始为循环小数
    			map remainderToPosition;	//余数到位置
    			remainderToPosition.insert(map::value_type(remainder, position));
    			position++;
    			while (remainder != 0){
    				remainder *= 10;
    				quotient = remainder / denominatorL;
    				remainder = remainder % denominatorL;
    				positionToQuotient.insert(map::value_type(position, quotient));
    				map::iterator it = remainderToPosition.find(remainder);
    				if (it != remainderToPosition.end()){	//若余数已经存在过
    					repeatStartPosition = it->second + 1;
    					break;
    				}
    				remainderToPosition.insert(map::value_type(remainder, position));
    				position++;
    			}
    			for (map::iterator it = positionToQuotient.begin(); it != positionToQuotient.end(); it++){
    				if (it->first == repeatStartPosition){
    					result += "(";
    				}
    				result += intToStr(it->second);
    			}
    			if (repeatStartPosition >= 0){
    				result += ")";
    			}
    		}
    		return result;
    	}
    
    private:
    	string intToStr(long long number){
    		string result = "";
    		do{
    			result = (char)(number % 10 + '0') + result;
    			number /= 10;
    		} while (number != 0);
    		return result;
    	}
    };


     

相关TAG标签
上一篇:jQuery.ajax向后台传数组
下一篇:Android开发中对WebView的简单使用
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站