1

c# 中的算法是什么?

示例 1:给定 n = 972,函数将附加 3 以生成 9723,因为 9 + 7 + 2 + 3 = 21(以 1 结尾)。函数应该返回 3。

示例 2:给定 n = 33,函数将附加 5 以得到 335,因为 3 + 3 + 5 = 11(以 1 结尾)。函数应该返回 5。

4

4 回答 4

3

算法与语言无关。要求“C# 中的算法”没有多大意义。

要求算法(好像只有一个)同样是错误的

所以,让我们一步一步来。

首先,我们注意到只有结果的最后一位是有意义的。所以,我们将总结我们现有的数字,然后忽略除最后一个之外的所有数字。一个很好的方法是取模 10 的总和。

所以,我们有现有数字的总和,我们想在上面加上另一个数字,这样两个数字的和就以 1 结尾。

对于绝大多数情况,这意味着sum + newDigit = 11. 重新排列给newDigit = 11 - sum

然后,我们可以(再次)取模 10 以将其减少到一位数。

最后,我们将原始数字乘以 10,并将我们的新数字添加到其中。

于 2010-02-22T03:01:58.557 回答
2

一般算法:

(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;
    }
于 2010-02-22T02:56:54.103 回答
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 回答
0

仅使用一次 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();
于 2010-02-22T03:31:42.563 回答