c# - 可被 n 整除的数的算法

标签 c#

首先用户给出一个数字(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/

相关文章:

c# - WPF 数据绑定(bind)错误 -- System.Windows.Data 错误 : 40

c# - 表单例份验证 cookie 中的 ASP.NET MVC 用户数据与添加到 session

c# - try catch 每个数据库连接?

c# - block 状流。代码正确吗?需要第二双眼睛

c# - 返回 linq 结果作为 2D 数组?

c# - 为什么我的更新查询在 c# 和 sql server 中不起作用?

c# - 为什么会发生这种情况? (SharpFont/Monogame 错误)

c# - DataGridView 不显示列/数据

c# - 意外的 protobuf-net 序列化程序行为

c# - 检测同时按下两个键