3

Code Chef で 1 つのコードを送信しましたが、それが正しい場合でも間違った回答を返しています。私は非常に多くの入力を試し、手動で計算しましたが、それらは正しいので、なぜ間違った答えを与えたのですか. だから、このコードで間違った出力を与えるテストケースを見つけることができる人はいますか? .

ここに問題の定義があります。 コード定義

import java.util.Scanner;
import java.lang.Math;
class Codechef {

    static int get(int n,int i,int digit)
    {
        int p;
        p=(int)Math.pow(10,i-1);
        n=n/p;
        return n%10;
    }

    static boolean check_pal(int n)
    {
        int digit;
        digit=(int) (Math.log10(n)+1);
        int a=0,b=0,i,j,p;
        int sum=0;

        for(i=1,j=digit-1 ; i<=digit ; i++,j-- )
        {
            a=get(n,i,digit);
            sum+=a*Math.pow(10,j);
        }

        if(sum==n)
            return true;
        else
            return false;
    }

    static int reverse(int n)
    {
        int digit;
        digit=(int) (Math.log10(n)+1);
        int a=0,b=0,i,j,p;
        int sum=0;

        for(i=1,j=digit-1 ; i<=digit ; i++,j-- )
        {
            a=get(n,i,digit);
            sum+=a*Math.pow(10,j);
        }

        return n+sum;
    }

    public static void main(String[] args) {
        try{
            Scanner sc=new Scanner(System.in);
            int n=sc.nextInt();

            if(n<10 || n>999){
                System.out.println("NONE");   
                return;
            }

            boolean c;
            for(int i=1 ; i<=100 ; i++)
            {
                c=check_pal(n);
                if(c==true)
                {
                    System.out.println(n);
                    return;
                }
                n=reverse(n);
            }
            System.out.println("NONE");
        }
        catch(Exception e)
        {
            System.out.println("NONE"); 
        }
    }
}

ここにもう 1 つの出力があります。99 の場合は 99 となり、これは回文であるため正しいです。 99のため

4

2 に答える 2

2

89 (または 98) の場合、コードは "NONE" を返しますが、わずか 24 ステップで答え 8813200023188 に到達します。

別のケースでは、177 と 276 の場合、NONE ではなく 8836886388 を取得する必要があります。

私はあなたのコードをデバッグしませんでした。同じことを行うプログラムを作成し、私のプログラムが提供した出力とあなたのプログラムが提供した出力を比較しました。テストケースをリクエストしたばかりなので、それで十分です:)私の直感は、あなたがオーバーフローしていることです...すべての場合に答えを保持するのに十分な大きさではありません。

楽しいバグハンティング。

私のコードで(リクエストに応じて)編集します。

入力のスキャンをバイパスして結果として文字列を返すことができるように、ロジックを getResult(integer) メソッドに抽出したことを除いて、コードは変更しませんでした。バージョン間のすべての違いが出力されます。結果を保持する型として BigInteger を使用しました。

public class Main {

public static void main(String[] args) {
    Main m = new Main();
    for (int i=10; i < 1000; i++) {
        String myResult = null;
        String hisResult = null;
        try {
        myResult = m.getResultAsString(i);
        } catch (Exception e){
        System.out.println("Your code threw an exception for " + i);
        }
        try{
            hisResult = Codechef.getResult(i);
        } catch (Exception e){
            System.out.println("His code threw an exception for " + i);
        }
        if (myResult != null && hisResult != null && ! myResult.equals(hisResult)) {
            System.out.println("For " + i + "  you have " + myResult + " but he has " + hisResult);
        }
    }
}

public String getResultAsString(int inputNumber) {
    BigInteger res = getResultAsBigInteger(new BigInteger(""+inputNumber));
    if (res != null) {
        return res.toString();
    } else {
        return "NONE";
    }

}

public BigInteger getResultAsBigInteger(BigInteger inputNumber) {
    int numberOfSteps = 0;
    BigInteger currentValue = inputNumber;
    while (numberOfSteps < 101 && ! isPalindrome(currentValue)) {
        numberOfSteps++;
        currentValue = currentValue.add(reverseDigits(currentValue));
    }
    return numberOfSteps < 101 ? currentValue : null;
}

public boolean isPalindrome(BigInteger number) {
    return number.equals(reverseDigits(number));
}

public BigInteger reverseDigits(BigInteger input) {
    String inputString = input.toString();
    String output = "";
    for (int i = inputString.length() - 1; i >= 0; i--)
    {
        output += inputString.charAt(i);
    }
    return new BigInteger(output);
}

}

于 2013-11-10T16:12:20.583 に答える
1

コードにオーバーフロー エラーがあります。入力 89 の場合、@Yves V のように機能しません。提案は lang.Match の BigInteger クラスを使用することであり、このオーバーフロー エラーを排除するのに役立ちます。

于 2013-11-11T05:08:13.193 に答える