1

これを行うためのC#のアルゴリズムは何ですか?

例 1: n = 972 の場合、9 + 7 + 2 + 3 = 21 (1 で終わる) であるため、関数は 3 を追加して 9723 を作成します。関数は 3 を返す必要があります。

例 2: n = 33 の場合、3 + 3 + 5 = 11 (1 で終わる) であるため、関数は 5 を追加して 335 にします。関数は 5 を返す必要があります。

4

4 に答える 4

3

アルゴリズムは言語に依存しません。「C#のアルゴリズム」を要求することはあまり意味がありません。

アルゴリズムを要求することは(1つしかないかのように)同様に誤った方向に進みます。

それでは、これを段階的に実行してみましょう。

まず、結果の最後の桁だけが意味があることに注意してください。したがって、既存の数字を合計して、最後の数字を除くすべてを無視します。これを行う良い方法は、10を法とする合計を取ることです。

したがって、既存の桁の合計があり、それに別の桁を追加して、2つの合計が1で終わるようにします。

ほとんどの場合、それはを意味しsum + newDigit = 11ます。再配置するとnewDigit = 11 - sum

次に、このモジュロ10を(再び)1桁に減らすために使用できます。

最後に、元の数値に10を掛けて、それに新しい数字を追加します。

于 2010-02-22T03:01:58.557 に答える
0

mod を 1 回だけ使用する別の方法

   int sum = 0;
    foreach (char c in s)
        sum += Convert.ToInt32(c.ToString());
    int diff = 0;
    while (sum % 10 != 1)
    {
        sum++; 
        diff++; 
    }
    if (diff > 0)
       s += diff.ToString();
于 2010-02-22T03:31:42.563 に答える
0

まあ、C++ の方が簡単です。

std::string s = boost::lexical_cast<string>( i );
i = i * 10 + 9 - std::accumulate( s.begin(), s.end(), 8 - '0' * s.size() ) % 10;

コードゴルフにはまっています…</p>

于 2010-02-22T03:43:59.877 に答える