[英]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::cout
或using 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.