繁体   English   中英

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

[英]C++ program to compute lcm of numbers between 1 to 20 (project euler )

如标题所示,这是一个查找1至20之间1cm数字的程序。我找到了一种算法来执行此操作,这是链接
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

如您所见,所有数字都等于1,即我们的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)

您实际上并没有为cout使用std名称空间。 这应该是std::cout<<l

您包括iostream.h 该标准是不带.h的iostream ,这可能不适用于这样的旧编译器

而不是在各处硬编码20,您应该使用#define 这不是错误,只是样式问题。

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

else
    continue;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM