c#函数接受整数n并返回可以除以除数1..n的最小数
Posted
技术标签:
【中文标题】c#函数接受整数n并返回可以除以除数1..n的最小数【英文标题】:c# function accept integer n and return lowest number that can be divided by divide numbers 1..n 【发布时间】:2022-01-02 05:36:34 【问题描述】:我需要编写一个函数,将 n 作为参数,并返回(作为字符串)最小的可能数字,而不是从 1 到 n 的所有数字。 例如,如果 n=4,则函数将返回 12,因为 12/4 12/3 12/2 12/1 是整数。
我已经编写了一个函数,当数字小于 19 时可以正常工作。超过 19 时,计算时间会变得更长。 有人可以给我一个提示,如何改进这个函数的机制以更快地完成它
public static string Smallest(int n)
int good = 0;//will hold number of times we got divide with no remianders
int num = n;//smallest possible number is n
while (true)
good = 0;
for (int i=n; i>=1; i--)
if (num % i ==0) good++;//meaning we got zero remainder for the divide
if (good == n) return num.ToString();//num of times we got zero remainders == n.
num++;
【问题讨论】:
首先,我很确定有一种在阴影中等待的体验,关于数字的某种模式。但是,鉴于您现有的代码,您应该尝试反转您的内部循环,以便如果您发现它没有划分的数字,请尽早中断,不要检查所有其他数字。 ***,从技术上讲,适用于损坏的代码 - 对于需要改进的工作代码,它更适合在 codereview.stackexchange 上询问。只是好奇,不是 4x3=12 和 5x4x3=60 作为候选开始等吗? 有一些示例代码on www.geeksforgeeks.org 可能会有所帮助。 这称为最低公倍数或 LCM。互联网上有很多关于它的东西。 【参考方案1】:对于大的n
,您将有巨大的 数字,这就是为什么让我们使用BigInteger
进行内部计算。
正如 Abhishek Pandey 所说,我们应该计算LCM
,可以得到
LCM(a, b) = a * b / GCD(a, b)
其中 CGD 是最大公约数
代码:
using System.Numerics;
...
public static string Smallest(int n)
if (n < 1)
throw new ArgumentOutOfRangeException(nameofn());
BigInteger result = 1;
for (int i = 1; i <= n; ++i)
result = result * i / BigInteger.GreatestCommonDivisor(result, i);
return result.ToString();
演示:
using System.Linq;
using System.Numerics;
...
var demos = string.Join(Environment.NewLine, Enumerable
.Range(1, 20)
.Select(n => $"n,2 : Smallest(n),20"));
Console.WriteLine(demos);
Console.WriteLine();
Console.WriteLine(Smallest(100));
结果:
1 : 1
2 : 2
3 : 6
4 : 12
5 : 60
6 : 60
7 : 420
8 : 840
9 : 2520
10 : 2520
11 : 27720
12 : 27720
13 : 360360
14 : 360360
15 : 360360
16 : 720720
17 : 12252240
18 : 12252240
19 : 232792560
20 : 232792560
69720375229712477164533808935312303556800
【讨论】:
【参考方案2】:你需要找到1 to n
中所有数字的LCM(最低公倍数)。
这是查找元素数组的 LCM 的一个很好的示例。 https://www.geeksforgeeks.org/lcm-of-given-array-elements/
您可以创建一个包含从 1 到 n 的所有数字的数组并将其传递给此函数。
或
您可以将其修改为仅传递 n
并使其对您的用例有效。
【讨论】:
【参考方案3】:我的逻辑:
-
我们取一个数字 - 可以返回的最小数字
number - 1 - 如果它不能在没有提醒的情况下除法,则添加到 n 初始 n
当2步有提醒时不要忘记将数字更新为首字母
这样做直到你得到正确的值
【讨论】:
以上是关于c#函数接受整数n并返回可以除以除数1..n的最小数的主要内容,如果未能解决你的问题,请参考以下文章
UVa 1363 Joseph's Problem (等差数列)
LeetCode二分查找1283.使结果不超过阈值的最小除数&875.爱吃香蕉的珂珂