C++程序来计算 1 到 20 之间的数字的 LCM(欧拉项目)
C++ program to compute lcm of numbers between 1 to 20 (project euler )
正如标题所解释的那样,这是一个查找 1 到 20 之间数字的 LCM 的程序。 我找到了一个算法来做到这一点,这是链接
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
正如您在某一点上看到的,所有数字都变得相等,这就是我们的 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)
您实际上并没有将std
命名空间用于cout
。 这应该是std::cout<<l
您的包括iostream.h
.没有 .h 的标准是iostream
的,这可能不适用于如此旧的编译器
与其在任何地方硬编码 20,不如使用 #define
.这不是错误,只是风格问题。
以下代码不执行任何操作。这是默认行为
else
continue;
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++ 中数组中所有数字的 LCM
- 使用模板计算2个数字的LCM
- C++程序来计算 1 到 20 之间的数字的 LCM(欧拉项目)
- c++中使用多个数字的LCM递归函数