gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:01 25 4
gpt4 key购买 nike

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

问题:我写的代码编译器没有显示错误,但是当我运行代码时程序变得疯狂,我猜可能是一些无限循环但我无法弄清楚我。我使用 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;
}

最佳答案

在这一行中:

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 到 20 之间数字的 lcm 的 C++ 程序(欧拉项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10646960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com