1

正如标题所解释的,这是一个查找 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;
}
4

2 回答 2

1

在这一行:

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.

于 2012-05-18T05:23:56.227 回答
0

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

jlcm()如果第一个元素是最小的,则in未初始化。它应该在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. 标准iostream没有.h,这可能不适用于这么旧的编译器

而不是到处硬编码 20,你应该使用#define. 这不是错误,只是风格问题。

下面的代码什么都不做。这是默认行为

else
    continue;
于 2012-05-18T05:40:17.427 回答