1

これは問題文です。

数 2345 を考えてみましょう。その数字を掛けると、数字 120 が得られます。120 の数字を再度掛けると、数字 0 が得られます。これは 1 桁の数字です。2345 の数字を追加すると、14 になります。14 の数字を追加すると、1 桁の数字である 5 になります。

したがって、任意の数は、いくつかのステップで 2 つの 1 桁の数に変換できます。2345 は 2 段階の桁の乗算を使用して 0 に変換され、2 段階の桁の加算を使用して 5 に変換されることがわかります。任意の数 N を考えてみましょう。これは、n1 段階で 1 桁の数 d1 に桁を乗算し、n2 段階で 1 桁の数 d2 に桁を追加することによって変換できるとします。

あなたの仕事は、N より大きく 1000000000 より小さい最小の数を見つけることです。これは、その数字を n1 以下のステップで d1 に乗算し、その数字を n2 以下のステップで d2 に加算することによって変換できます。

C# でそれを解決する方法...

4

4 に答える 4

2

私が確認できるメモリの問題は 2 つあります。1 つ目は、多数の文字列の生成です。次のようにアプローチすることをお勧めします。

static int SumDigits(int value)
{
    int total = 0;
    while (value > 0)
    {
        total += value % 10;
        value /= 10;
    }
    return total;
}

(これは完全にテストされていません)

2 番目の問題は、膨大なリストです。lstString最小値を見つけるためだけにすべての値を(に) 格納する必要はありません。これまでの最高の成果を記録してください。または、すべての値のデータが必要な場合: として保存しないでくださいstring。実際、とにかくi(リスト/配列内の位置から)暗示される可能性があるため、本当に必要なのはすべての値の値の です。だけでも 4 GB であるため、最近の .NET バージョンでは大規模配列のサポートが必要になります ( ) 。しかし、はるかに良いでしょう: 保管しないでください。int[]cntint[1000000000]<gcAllowVeryLargeObjects>

于 2013-06-13T08:58:38.230 に答える