最短连续重复字符串 - 需要逻辑,以查找小数后最短的重复字符串长度

时间:2017-04-14 06:21:55

标签: java

您获得P / Q形式的一小部分,其中p和q是正整数。

查找小数部分中最长重复字符串的长度。如果小数部分不是重复打印-1。

约束:

0℃; T< 12000

0℃; P< 14000

0℃; Q< 14000

输入格式:

第一行输入包含T,即测试用例的数量。

下一个T行包含每个包含两个空格分隔的正整数P和Q的测试用例。

输出格式:

P / Q小数部分中最短连续重复串的输出长度。

示例输入:

3

1 1

2 4

10 30

1 7

示例输出:

-1

-1

1

6

阐释:

1/1没有重复的小数,所以-1

2/4没有重复的小数,所以-1

10/30的十进制表示是2.2222 ....所以最短的连续重复部分的长度为1(字符串为2)

1/7的十进制表示为0.14285714285 ..因此最短的连续重复字符串为142857,长度为6.

时间限制: 3

内存限制(MB): 500

我的声明(不完整

import java.util.HashMap;
import java.util.Scanner;
class RecurringFraction
{
 public String fractionToDecimal(int numerator, int denominator) 
 {  
   long nume = Math.abs((long)numerator);

    long deno = Math.abs((long)denominator);

    String sign = (numerator < 0) ^ (denominator < 0) ? "-" : "";

    if (deno == 0) {

        return "";

    } else if (nume == 0) {

        return "0";

    } else if (nume % deno == 0) {

        return sign + nume/deno + "";

    }



    HashMap<Long,Integer> map = new HashMap<Long, Integer>(); //Erroneous line

    StringBuffer rst = new StringBuffer(sign + nume/deno + ".");

    long end = nume%deno * 10;//The decimal portion of the value, after decimal point

    int i = 0;

    while (end != 0){

        if (map.containsKey(end)) {

            rst.insert(rst.indexOf(".") + map.get(end) + 1, "(");

            rst.append(")");

            return rst.toString();

        }

        rst.append(end/deno);

        map.put(end, i++);

        end = (end % deno) * 10;

    }

    return rst.toString();
    }

   public static void main(String[] args) 
    {
    int num,den; 
    RecurringFraction rf=new RecurringFraction();
    System.out.println("Enter Test Case:")
    Scanner sc0=new Scanner(System.in);
    int testcase=sc0.nextInt();
        if ((!testcase) && (testcase<=1200) 
        {
            for(int i=0; i<=testcase;i++)
                {
                Scanner sc=new Scanner(System.in);
                num=sc.nextInt();
                Scanner sc1=new Scanner(System.in);
                den=sc1.nextInt();
                }
         }
        if(((!num) && (num>=1400)) && ((!den)&&(den>=1400)))
                { 
                    System.out.print( rf.fractionToDecimal(num,den));
                }

           }




      }
      }

我被困在错误的行上加上我需要根据上面的问题陈述来实现逻辑,请建议我找到十进制i之后的最短重复字符串的最佳最优解,e分数部分。

1 个答案:

答案 0 :(得分:0)

该行是错误的,因为您尝试在原始Range of numpy double: -1.79769313486e+308 1.79769313486e+308 At the border: 1.6332525973e+308 Blowing out of range: inf D:\anaconda\lib\site-packages\ipykernel\__main__.py:9: RuntimeWarning: overflow encountered in double_scalars 和不存在的类型HashMap上参数化long。 将行更改为:

integer

HashMap<Long,Integer> map = new HashMap<Long, Integer>(); 需要使用实际类型进行参数化。

关于算法,请告诉我们更多关于你为什么不工作(最佳)并考虑发布一个新的,更精确的问题,因为这个实际上是二合一:“为什么代码没有编译?”和“怎么做?”