两个数的LCM
我的LCM程序得到了错误的结果 i首先找到数字的gcd,然后用gcd除以乘积两个数的LCM,c,algorithm,overflow,greatest-common-divisor,lcm,C,Algorithm,Overflow,Greatest Common Divisor,Lcm,我的LCM程序得到了错误的结果 i首先找到数字的gcd,然后用gcd除以乘积 int gcd(int x, int y) { while(y != 0) { int save = y; y = x % y; x = save; } return y; } int lcm(int x, int y) { int prod = x * y; int Gcd = gcd(x,y); int lcm = prod / Gcd; return l
int gcd(int x, int y)
{
while(y != 0)
{
int save = y;
y = x % y;
x = save;
}
return y;
}
int lcm(int x, int y)
{
int prod = x * y;
int Gcd = gcd(x,y);
int lcm = prod / Gcd;
return lcm;
}
非常感谢您的帮助。您的
gcd
函数将始终返回0
。改变
return y;
到
了解欧几里德算法:
RULE 1: gcd(x,0) = x
RULE 2: gcd(x,y) = gcd(y,x % y)
考虑x=12
和y=18
gcd (12, 18)
= gcd (18, 12) Using rule 2
= gcd (12,6) Using rule 2
= gcd (6, 0) Using rule 1
= 6
如您所见,当y
变为零时x
将是gcd
,因此您需要返回x
,而不是y
此外,在计算lcm时,您将首先乘以数字,这可能会导致溢出。相反,您可以:
lcm = x * (y / gcd(x,y))
但是如果lcm
无法放入int
中,则必须使其长问题1)int gcd=gcd(x,y)代码>
gcd
已定义为一个函数。不能使用相同的名称定义变量
问题2)将gcd()
中的返回y
更改为返回x
,否则每次都将返回0
问题3)x*y
如果x
和y
较大,则可能会溢出。您应该在gcd函数中返回x而不是y
另外,您确定产品x*y始终适合int
?使用long
也可能是一个好主意。\include
#include <iostream>
using namespace std;
long long gcd(long long int a, long long int b){
if(b==0)
return a;
return gcd(b,a%b);
}
long long lcm(long long a,long long b){
if(a>b)
return (a/gcd(a,b))*b;
else
return (b/gcd(a,b))*a;
}
int main(){
long long int a ,b ;
cin>>a>>b;
cout<<lcm(a,b)<<endl;
return 0;
}
使用名称空间std;
长-长gcd(长-长整型a,长-长整型b){
如果(b==0)
返回a;
返回gcd(b,a%b);
}
长-长lcm(长-长a,长-长b){
如果(a>b)
申报表(a/gcd(a、b))*b;
其他的
报税表(b/gcd(a,b))*a;
}
int main(){
长内点a,b;
cin>>a>>b;
这个C程序是寻找LCM的不同方法
#include<stdio.h>
int main()
{
int a,b,lcm=1,i=2;
printf("Enter two numbers to find LCM\n" );
scanf("%d %d",&a ,&b);
while(i <= a*b)
{
if(a%i==0 & b%i==0)
{
lcm=lcm*i;
a=a/i;
b=b/i;
i=i-1;
}
if( a%i==0 & b%i!=0)
{
lcm=lcm*i;
a=a/i;
i=i-1;
}
if( b%i==0 & a%i!=0)
{
lcm=lcm*i;
b=b/i;
i=i-1;
}
i++;
}
printf("The LCM of numbers is %d\n", lcm);
}
#包括
int main()
{
int a,b,lcm=1,i=2;
printf(“输入两个数字以查找LCM\n”);
scanf(“%d%d”、&a和&b);
while(谢谢你。问题1是一个输入错误。问题2解决了它。如果x*y
可以溢出,那么lcm
的结果也可以溢出;决定因素是lcm
函数类型的大小。这应该写为itype lcm(intx,inty){return(itype)x/gcd(x,y)*y;}
其中itype
是一个足够大的整数类型,可以容纳任何预期结果。如果您测试过gcd,您会发现它总是返回0,其原因很明显。一旦gcd正常工作,那么就应该检查lcm是否正确。这表明了一个普遍的策略,即ftware开发和调试。此外,这段代码甚至没有编译的事实令人怀疑:您是如何从中得到错误结果的?谢谢Jim的提示。这段代码现在对我来说运行良好。@user642371将来,请发布您编译的实际代码。对注释的响应应该包含@name,以便您所遇到的人重新响应已发出警报。谢谢。@user642371:它认为您已经理解了为什么必须返回x而不是y。关于溢出,假设x和y都是2000000000。这非常适合于int
,它们的LCM也是2000000000,这同样没有问题。但是在中间步骤中,您计算x*y
,并将其存储在int
。现在,x*y
是2000000000*2000000000,即4*10^18。这对于int
来说太大,将导致溢出。您将在prod
中输入一个错误的值,并且将其除以gcd将再次给出一个无意义的值,因为原始值由于溢出而被列出。@user642371 N请注意,仅将产品放在long-long中是不够的;您需要将lcm函数的类型设置为long-long以处理所有情况。例如,lcm(20000000000,20000001)是4000000002000000,它太大,无法放入int中。
#include<stdio.h>
int main()
{
int a,b,lcm=1,i=2;
printf("Enter two numbers to find LCM\n" );
scanf("%d %d",&a ,&b);
while(i <= a*b)
{
if(a%i==0 & b%i==0)
{
lcm=lcm*i;
a=a/i;
b=b/i;
i=i-1;
}
if( a%i==0 & b%i!=0)
{
lcm=lcm*i;
a=a/i;
i=i-1;
}
if( b%i==0 & a%i!=0)
{
lcm=lcm*i;
b=b/i;
i=i-1;
}
i++;
}
printf("The LCM of numbers is %d\n", lcm);
}