C# 一个可整除为n的数的算法

C# 一个可整除为n的数的算法,c#,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 = 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);
使用这个简单的代码

int inputNumber = 5/*Or every other number, you can get this number from input.*/;
int result=1;
for (int i = 1; !IsOk(result,inputNumber); i++)
{
    result = i*inputNumber;
}
Print(result);
IsOk方法如下:

bool IsOk(int result, int inputNumber)
{
    if(result%inputNumber!=0)
        return false;
    if(result.ToString().Replace("9",string.Empty).Replace("0",string.Empty).Length!=0)
        return false;
    return true;
}
您可以这样尝试:

string a = txtNumber.Text;
Int64 x = Convert.ToInt64(a);

int counter;
for (counter = 1; !isValid(x * counter); counter++)
{
}
lblAnswer.Text = Convert.ToString(counter*x);
上述代码通过递增搜索
x
的倍数来工作,直到找到满足条件的
result
:“仅由0和或9位数字组成”。通过只搜索
x
的倍数,可以保证它可以被
x
整除。因此,其余部分将使用以下
isValid()
函数检查候选结果的有效性:

private static bool isValid(int number)
{
    var lastDigit = number%10;

    //last digit is invalid, return false
    if (lastDigit != 0 & lastDigit != 9) return false;

    //last digit is valid, but there is other digit(s)
    if(number/10 >= 1) 
    {
        //check validity of digit(s) before the last
        return isValid(number/10);
    }

    //last digit is valid, and there is no other digit. return true
    return true;
}
关于上面代码段中的奇怪的空
for
循环,它只是语法上的糖衣,使代码稍微短一点。它相当于以下
循环:

counter = 1;
while(!isValid(input*counter))
{
    counter++;
}

如果您很乐意使用纯功能,那么这是可行的:

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();

这些结果非常快
f(117238L)
在我的计算机上以138ms的时间返回结果。

我的第一个解决方案性能非常差,因为它将数字转换为字符串并查找字符“9”和“0”

新解决方案:

我的新解决方案具有非常好的性能,并且是一种技术方法,因为它使用了广度优先搜索(BFS)

此解决方案的算法:

对于每个输入的数字,测试9,如果是答案,则打印它,否则将2个子数字(90和99)添加到队列中,并继续,直到找到答案

int inputNumber = 5;/*Or every other number, you can get this number from input.*/
long result;
var q = new Queue<long>();
q.Enqueue(9);
while (true)
{
    result = q.Dequeue();
    if (result%inputNumber == 0)
    {
        Print(result);
        break;
    }
    q.Enqueue(result*10);
    q.Enqueue(result*10 + 9);
}
int inputNumber=5/*或者每隔一个数字,您可以从输入中获取此数字*/
长期结果;
var q=新队列();
q、 排队(9);
while(true)
{
结果=q.Dequeue();
如果(结果%inputNumber==0)
{
打印(结果);
打破
}
q、 排队(结果*10);
q、 排队(结果*10+9);
}
编号创建的跟踪:

九,

90,99

90090999999

9000909090909090999999999

。 .
.

我为console编写了这段代码,并使用了goto命令,但它不是首选命令,但我无法仅为编写

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace main
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter your number");
        Int64 x = Convert.ToInt64(Console.ReadLine());
        Int64 y, j, i, k, z = x;
        x = x + 5;
    loop:
        x++;
        for (i = 0, y = x; y != 0; i++)
            y /= 10;

        for (j = x, k = i; k != 0; j /= 10, k--)
        {
            if (j % 10 != 9)
                if (j % 10 != 0)
                    goto loop;
        }
        if (x % z != 0)
            goto loop;
        Console.WriteLine("answer:{0}",x);
        Console.ReadKey();
    }
}
}

我没有收到你的问题。例如,你给出5,答案应该是系数5,应该是数字0和9。当前代码有问题吗,如果有任何问题,请在您的帖子中提及。数字只包含
0
&
9
不允许任何其他数字或其他数字……为什么答案不是0?它可以被5整除,并且不包含除0和9以外的任何数字。或者0和9都必须是输出的一部分?在这种情况下,3的输出也会是90吗?对于“!isValid(x*counter)”,我得到了错误“有一些无效参数”。而for循环如何为空,但有{}?关于
for
循环,请检查我的更新。关于这个错误,我不明白这个错误,在这里工作很好
isValid
函数在此示例中除了
int
参数外,请确保
x
counter
在您的代码中都是
int
。请获取导致我的代码产生错误答案的测试数据。您的代码完全按照原样生成结果
0
,而不是
90
。没错,变量“i”大多数由“1”初始化,而不是“0”。代码回收,测试它。让我们用一个超快速的函数修改我的答案。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace main
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter your number");
        Int64 x = Convert.ToInt64(Console.ReadLine());
        Int64 y, j, i, k, z = x;
        x = x + 5;
    loop:
        x++;
        for (i = 0, y = x; y != 0; i++)
            y /= 10;

        for (j = x, k = i; k != 0; j /= 10, k--)
        {
            if (j % 10 != 9)
                if (j % 10 != 0)
                    goto loop;
        }
        if (x % z != 0)
            goto loop;
        Console.WriteLine("answer:{0}",x);
        Console.ReadKey();
    }
}
}