c#中的算法是什么?
示例1: 给定n = 972,函数将追加3以产生9723,因为9 + 7 + 2 + 3 = 21(以1结尾)。功能应返回3.
示例2: 给定n = 33,函数将追加5以得到335,因为3 + 3 + 5 = 11(以1结尾)。函数应返回5.
答案 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;
沉迷于代码高尔夫...