项目Euler 24使用java逻辑错误

时间:2015-11-22 18:16:27

标签: java functional-programming permutation

我正在努力解决问题24 https://projecteuler.net/problem=24 项目欧拉和我花了很多时间在这个问题上,但仍然没有成功。

但现在不是问题,我想知道我的方法有什么问题。

我使用简单的排列来获得最左边的数字并从要找到的项中获得剩余值(通过减去ie使用模运算符)。

Java代码:

import java.util.ArrayList;

public class LexOrder
{

public static int factorial(int num)
{
    int res=1;
    if(num <= 1)
        return 1;

    while(num > 1)  
    {
        res *= num--;   
    }
    return res;
}

public static ArrayList<Integer> addValue(int digit, ArrayList<Integer> al)
{
    int temp=0, count=0;    
    while( count <= digit )
    {
        if( al.contains(count) )
            temp++;
     count++;
    }

    int val = digit+temp;

    //checking weather the new number exists in the ArrayList or not.
    while(true)
    {
        if(! al.contains(val) )
        {
            al.add(val);
            break;
        }
        else
        {
            val++;
        }
    }
    return al;
}

public static void main(String args[])
{
    ArrayList<Integer> al = new ArrayList<Integer>();   
    int index = 999999; 
    int numOfDigit = 10;

    if( factorial( numOfDigit ) > index && index >= 0)
    {
            System.out.println("Index Validated");
    }
    else
    {
            System.out.println("Index out of bounds");
            System.exit(0);
    }

    int digit, count=1;
    while( index !=0  )
    {
        digit = ( index / factorial( numOfDigit - count ) );
        al = addValue(digit, al);

        index = ( index % factorial( numOfDigit - count ) );

        if(index == 0)
            break;
        count++;
    }

    // Adding value in ascending order.
    int temp =0;
    while( al.size() < numOfDigit )
    {

        if(!al.contains(temp))
            al.add(temp);

    temp++;
    }

    System.out.println(al);
}
}

输出: [2,7,8,3,9,1, 4,5 ,6,0]

输出应该是: 278391的 54 60

2 个答案:

答案 0 :(得分:2)

所以,如果没有能够引导您完成确切的数字,我可以通过您管理数字的方式来解决问题:

int temp=0, count=0;    
while( count <= digit )
{
    if( al.contains(count) )
        temp++;
 count++;
}

int val = digit+temp;

此方法尤其无法检查某些数字(特别是digitdigit+temp之间的数字)是否已存在于数组列表中。

我能够通过计算未使用的元素数量来修复它:

int val=0, count=0;
while( count < digit)
{   if( !al.contains(val++) )
        count++;
}

答案 1 :(得分:1)

问题是方法addValue。正确编写此方法的一种简单但低效的方法是

public static ArrayList<Integer> addValue(int digit, ArrayList<Integer> al) {
    List<Integer> list = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
    list.removeAll(al);
    al.add(list.get(digit));
    return al;  // Really this should be a void method as al is a parameter.
}

通过这些更改,输出可以按您的要求进行。