将数字附加到整数,并确保每个数字的总和以1结尾

时间:2010-02-22 02:54:20

标签: c# algorithm sum-of-digits

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 个答案:

答案 0 :(得分:3)

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

要求 算法(好像只有一个)同样被误导了。

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

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

因此,我们有现有数字的总和,我们想要将另一个数字加到那里,以便两者的总和为1。

绝大多数情况下,这意味着sum + newDigit = 11。重新排列提供newDigit = 11 - sum

然后我们可以采用这个模10(再次),以便将其减少到一位数。

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

答案 1 :(得分:2)

一般算法:

(10 - (数字总和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;
    }

答案 2 :(得分: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();

答案 3 :(得分: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;

沉迷于代码高尔夫...