C ++程序计算1到20之间的数字lcm(项目euler)

时间:2012-05-18 05:03:05

标签: c++ lcm

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

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

算法

说我们需要找到lcm为2,6,8

首先我们找到系列中最少的系列,并在其上面加上它上面的数字,即系列变为

4,6,8

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

6,6,8

所以下一次迭代变成了

8,6,8

8,12,8

10,12,8

10,12,14,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;
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

如果第一个元素最小,则j中的{p> lcm()未初始化。它应该在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;