正如标题解释这是一个程序,可以找到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;
}
答案 0 :(得分:1)
在这一行:
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
。
答案 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;