首先用户给出一个数字(n)进行编程,例如5。
程序必须找到可以整除为 n (5) 的最小数字。
并且这个数字只能由数字 0 和 9 组成,不能包含任何其他数字。
例如,如果用户给 5 给程序。 可以整除 5 的数字是:
5, 10, 15, 20, 25, 30, ..., 85, 90, 95, ...
但这里的 90 是最小的可以整除 5 的数,也是由数字 (0 , 9) 组成的。所以 5 的答案必须是 90。
9 的答案是 9,因为它可以被分成 9 并且由数字 (9) 组成。
我的代码
string a = txtNumber.Text;
Int64 x = Convert.ToInt64(a);
Int64 i ,j=1,y=x;
bool t = false;
for (i = x + 1; t == false; i++)
{
if (i % 9 == 0 && i % 10 == 0 && i % x == 0)
{
j = i;
for (; (i /= 10) != 0; )
{
i /= 10;
if (i == 0)
t = true;
continue;
}
}
}
lblAnswer.Text = Convert.ToString(j);
最佳答案
如果您乐于使用纯函数式功能,那么这很有效:
Func<IEnumerable<long>> generate = () =>
{
Func<long, IEnumerable<long>> extend =
x => new [] { x * 10, x * 10 + 9 };
Func<IEnumerable<long>, IEnumerable<long>> generate2 = null;
generate2 = ns =>
{
var clean = ns.Where(n => n > 0).ToArray();
return clean.Any()
? clean.Concat(generate2(clean.SelectMany(extend)))
: Enumerable.Empty<long>();
};
return generate2(new[] { 9L, });
};
Func<long, long?> f = n =>
generate()
.Where(x => x % n == 0L)
.Cast<long?>()
.FirstOrDefault();
因此,与其遍历所有可能的值并测试 0
& 9
和整除性,这只会生成具有 0
& 9
然后只测试可见性。这种方式要快得多。
我可以这样调用它:
var result = f(5L); // 90L
result = f(23L); //990909L
result = f(123L); //99999L
result = f(12321L); //90900999009L
result = f(123212L); //99909990090000900L
result = f(117238L); //990990990099990990L
result = f(1172438L); //null == No answer
这些结果非常快。 f(117238L)
在 138 毫秒内在我的计算机上返回结果。
关于c# - 可被 n 整除的数的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22111537/