C++程序来计算 1 到 20 之间的数字的 LCM(欧拉项目)



正如标题所解释的那样,这是一个查找 1 到 20 之间数字的 LCM 的程序。 我找到了一个算法来做到这一点,这是链接
http://www.cut-the-knot.org/Curriculum/Arithmetic/LCM.shtml网页上有一个Java小程序,可以更好地解释算法

问题:我编写的代码编译器没有显示错误,但是当我运行代码时,程序变得疯狂,我想可能是一些无限循环,但我一生都无法弄清楚。 我使用 Turbo C++ 4.5,所以基本上如果有人可以查看代码并帮助我,那就太好了. 提前致谢

算法:

假设我们需要找到 2,6,8 的 LCM

首先,我们找到序列中最少的,并在其上方添加数字,即序列变为

4,6,8

现在我们再次找到最小值,并在列中添加初始值,即 2

6,6,8

所以下一次迭代变成了

8,6,8

8,12,8

10,12,8

10,12,16

12,12,16

14,12,16

14,18,16

16,18,16

18,18,16

18,18,24

20,18,24

20,24,24

22,24,24

24,24,24

正如您在某一点上看到的,所有数字都变得相等,这就是我们的 LCM

#include<iostream.h>
/*function to check if all the elements of an array are equal*/
int equl(int a[20], int n)
{
int i=0;
  while(n==1&&i<20)
 {
  if (a[i]==a[i+1])
        n=1;
  else
        n=0;
        i++;
  }
 return n;
}
/*function to calculate lcm and return that value to main function*/

int lcm()
{
int i,k,j,check=1,a[20],b[20];
/*loading both arrays with numbers from 1 to 20*/
for(i=0;i<20;i++)
{
    a[i]=i+1;
    b[i]=i+1;
}
check= equl(a,1);
/*actual implementation of the algorith*/
while(check==0)
 {
    k=a[0];                  /*looks for the least value in the array*/
    for(i=0;i<20;i++)
    {
        if(a[i+1]<k)
            {
                k=a[i+1];       /*find the least value*/
                j=i+1;          /*mark the position in array */
            }
        else
            continue;
    }
    a[j]=k+b[j];            /*adding the least value with its corresponding number*/
    check= equl(a,1);
 }
 return (a[0]); 
/*at this point all numbers in the array must be same thus any value gives us the lcm*/
}
void main()
{
 int l;
 l=lcm();
 cout<<l;
}

在这一行中:

a[j]=k+b[j];

你使用j但它是单位化的,所以它是一些巨大的价值,你超出了数组边界,因此你得到了一个分段错误。

你的代码中也发生了一些奇怪的事情。 void main(),你使用cout而不说std::coutusing namespace std;或类似的东西。一种奇怪的做法。

另外,如果你要lcm()函数,你不认为你应该将数组作为参数传递吗?那是int lcm(int a[], int b[]);.

您也可以考虑使用调试器并改进编码实践。在调试器的帮助下,我在将代码粘贴到编译器中的 30 秒内发现了此错误。

您的循环条件为:

while(n==1&&i<20)

所以你的equl函数永远不会返回 1,因为如果 n 恰好是 1,那么循环将继续运行,永远不会返回 1。但是,您的程序似乎仍然没有返回正确的结果。您可以拆分找到最小元素的代码片段,并将其替换为以下内容以确保清洁:

int least(int a[], int size){
    int minPos = 0;
    for(int i=0; i<size ;i++){
        if (a[i] < a[minPos] ){
            minPos = i;
        }
    }
    return minPos;
}

然后你可以通过说j = least(a, 20);来调用它。我会把你的程序的进一步工作留给你。考虑将变量称为有意义的变量,而不是i,j,k,a,b

您的equl函数使用从 0-20 的数组索引,但数组只有 1-19

如果第一个元素最小,则lcm()中的j未初始化。它应该在 while 循环的顶部设置为 0

在下面的代码中,当 i=19 时,您正在访问 a[20] ,这超出了数组的范围。应该for(i=0;i<19;i++)

for(i=0;i<20;i++) {
    if(a[i+1]<k)

您实际上并没有将std命名空间用于cout。 这应该是std::cout<<l

您的包括iostream.h.没有 .h 的标准是iostream的,这可能不适用于如此旧的编译器

与其在任何地方硬编码 20,不如使用 #define .这不是错误,只是风格问题。

以下代码不执行任何操作。这是默认行为

else
    continue;

最新更新