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.爱吃香蕉的珂珂

算法的正确性和逻辑:最小步数到一

最大公约数和最小公倍数

我如何编写一个接受整数并使用while循环返回前n个偶数之和的函数function(n)?

除数查找功能的问题。预期为 <System.Int32[2]>