これを行うためのC#のアルゴリズムは何ですか?
例 1: n = 972 の場合、9 + 7 + 2 + 3 = 21 (1 で終わる) であるため、関数は 3 を追加して 9723 を作成します。関数は 3 を返す必要があります。
例 2: n = 33 の場合、3 + 3 + 5 = 11 (1 で終わる) であるため、関数は 5 を追加して 335 にします。関数は 5 を返す必要があります。
これを行うためのC#のアルゴリズムは何ですか?
例 1: n = 972 の場合、9 + 7 + 2 + 3 = 21 (1 で終わる) であるため、関数は 3 を追加して 9723 を作成します。関数は 3 を返す必要があります。
例 2: n = 33 の場合、3 + 3 + 5 = 11 (1 で終わる) であるため、関数は 5 を追加して 335 にします。関数は 5 を返す必要があります。
アルゴリズムは言語に依存しません。「C#のアルゴリズム」を要求することはあまり意味がありません。
アルゴリズムを要求することは(1つしかないかのように)同様に誤った方向に進みます。
それでは、これを段階的に実行してみましょう。
まず、結果の最後の桁だけが意味があることに注意してください。したがって、既存の数字を合計して、最後の数字を除くすべてを無視します。これを行う良い方法は、10を法とする合計を取ることです。
したがって、既存の桁の合計があり、それに別の桁を追加して、2つの合計が1で終わるようにします。
ほとんどの場合、それはを意味しsum + newDigit = 11
ます。再配置するとnewDigit = 11 - sum
次に、このモジュロ10を(再び)1桁に減らすために使用できます。
最後に、元の数値に10を掛けて、それに新しい数字を追加します。
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();
まあ、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>