c# 中的算法是什么?
示例 1:给定 n = 972,函数将附加 3 以生成 9723,因为 9 + 7 + 2 + 3 = 21(以 1 结尾)。函数应该返回 3。
示例 2:给定 n = 33,函数将附加 5 以得到 335,因为 3 + 3 + 5 = 11(以 1 结尾)。函数应该返回 5。
c# 中的算法是什么?
示例 1:给定 n = 972,函数将附加 3 以生成 9723,因为 9 + 7 + 2 + 3 = 21(以 1 结尾)。函数应该返回 3。
示例 2:给定 n = 33,函数将附加 5 以得到 335,因为 3 + 3 + 5 = 11(以 1 结尾)。函数应该返回 5。
算法与语言无关。要求“C# 中的算法”没有多大意义。
要求算法(好像只有一个)同样是错误的。
所以,让我们一步一步来。
首先,我们注意到只有结果的最后一位是有意义的。所以,我们将总结我们现有的数字,然后忽略除最后一个之外的所有数字。一个很好的方法是取模 10 的总和。
所以,我们有现有数字的总和,我们想在上面加上另一个数字,这样两个数字的和就以 1 结尾。
对于绝大多数情况,这意味着sum + newDigit = 11
. 重新排列给newDigit = 11 - sum
然后,我们可以(再次)取模 10 以将其减少到一位数。
最后,我们将原始数字乘以 10,并将我们的新数字添加到其中。
一般算法:
(10 - (数字总和 mod 10) + 1) mod 10
上述表达式的答案是您需要的数字。
数字总和 mod 10 为您提供当前余数,当您从 10 中减去此余数时,您将获得余数为 0 的所需值。当您添加 1 时,您将获得余数为 1 所需的值。最后一个 mod 10 为您提供答案为 1 位数字。
所以在 C# 中是这样的:
static int getNewValue(string s)
{
int sum = 0;
foreach (char c in s)
{
sum += Convert.ToInt32(c.ToString());
}
int newDigit = (10 - (sum % 10) + 1) % 10;
return newDigit;
}
好吧,在 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>
仅使用一次 mod 的另一种选择
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();