0

私は初心者プログラマーで、Codility フロッグ ジャンプの質問を試しています。これが私のコードソリューションです:

int solution(int, int, int, unsigned long int&);

int main(){

    unsigned long int stepsTaken = 1;

    int x = 10;
    int y = 85;
    int d = 30;

    solution(x, y, d, stepsTaken);

    cout << "Total Steps Taken: " << stepsTaken << endl;
}

int solution( int X, int Y, int D, unsigned long int &stepsTaken) {

    int currentPosition = X;
    int positionToGetTo = Y;
    int stepsJumpedEachTime = D;

    currentPosition += stepsJumpedEachTime;

    if(currentPosition < positionToGetTo){

        stepsTaken++;
        solution(currentPosition, positionToGetTo, stepsJumpedEachTime, stepsTaken);
    }

    return stepsTaken;
}

今私が抱えている問題は、1 から 1000000000 までの数値範囲を処理するための要件を満たそうとするときです。上記の int y を 2000000 に変更すると、負の値が返されます。unsigned long int は正の数を返す必要がありますが、2000000 を使用すると負の値が返されます。

4

8 に答える 8

2

これは、C++ の int 数値に制限があるために発生します。http://www.cplusplus.com/reference/climits/を参照してください。ほとんどの場合、標準タイプでニーズを満たすことができます。

十分な大きさの標準型がない場合は、C++ の (速度の点で) 最適な任意精度ライブラリは何ですか?を参照してください。

これはあなたのコードのより単純なバージョンです。どう思いますか?

unsigned long int solution( int currentPosition, int positionToGetTo , int stepsJumpedEachTime) {

    if (currentPosition >= positionToGetTo)
        return 0; 

    return 1 + solution(currentPosition + stepsJumpedEachTime, positionToGetTo, stepsJumpedEachTime);

}

int main(){

    int x = 10;
    int y = 85;
    int d = 30;

    unsigned long int stepsTaken = solution(x, y, d);

    cout << "Total Steps Taken: " << stepsTaken << endl;
}
于 2013-09-19T15:23:47.673 に答える
0

これがうまくいくことを願っています:

class Solution {
    public int solution(int X, int Y, int D) {
    if(X>=Y)
    return 0;
    if((Y-X)%D!=0) return (Y-X)/D+1;
    else
    return (Y-X)/D;
   }
}
于 2014-02-08T18:26:38.813 に答える
0

C ソリューション。Codility で 100 ポイント中 100 ポイント

int FrogJmp(int X, int Y, int D) {

    int result = 0;
    int dest = Y - X;
    result = dest / D;

    if (dest % D != 0) {
        result++;
    }
    return result;
}
于 2014-05-18T22:33:35.767 に答える
0

「int」バージョンよりも x64 CPU で約 3 倍高速な 100%「float」バージョン:

#include <cmath>

int solution(int X, int Y, int D)
{
    return std::floor( (double)( Y - 1 - X ) / D + 1 );
}
于 2014-02-22T16:21:12.380 に答える
0

100% スコア - C コード :Codility: FrogJmp

int solution(int X, int Y, int D) {
    // write your code in C90
    if (Y == X) 
      return 0;
    else
      return (((Y - X) / D) + (((Y - X) % D) > 0 ? 1 : 0));     
}

予想される最悪の場合の時間の複雑さは O(1) であり、反復がないことを意味します...

于 2014-08-08T02:55:39.680 に答える
0

ceil を使用したソリューション:

#include <cmath>
#include <climits>

int solution(int X, int Y, int D) 
{
    if (X >= Y)
        return 0;

    if (D == 0)
        return INT_MAX;

    return std::ceil((double)(Y - X) / D);
}
于 2014-07-13T17:33:01.073 に答える