C# 一个可整除为n的数的算法
首先,用户给程序一个数字(n),例如5C# 一个可整除为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)的最小数字。
这个数字只能由数字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();
}
}
}