一个c++小程序 求2个数的最大公约数 和最小公倍数的问题

#include<iostream>
using namespace std;
int main()
{
double a,b,c=1,d;//a,b接受数值,c最小公倍数,d最大公约数
cout<<"请输入两个数值:";
cin>>a;
cin>>b;
asd:
if(a*c!=b*c)
{
c++;
goto asd;
}
if(a>=b)
d=a;
else
d=b;
qwe:
if(a/d!=b/d)
{
d--;
goto qwe;
}
cout<<"这两个数的最大公约数和最小公倍数分别是:"<<d<<" "<<c<<endl;
return 0;
}
这个程序有什么错误么?
为什么没有输出呢?

1、2个 if 语句判断条件是错的,
if(a*c!=b*c)只要输入a!=b 你的判断永远true 后面那个也是错的
2、goto语句一般都不用了,基本被淘汰了,因为绝大多数的goto 都可以用while或for解决
3、double型没有公约数公倍数之说 只有int 或者 long才有
4、你在 if 里面用 c++ d-- 会即使你判断条件正确也会在最后在执行一次运算 比如 3 和6你会算出 6然后+1输出 7; 这也是goto语句的一个问题
5、#include<iostream>
using namespace std;
int main()
{
int a,b,c=1,d;//a,b接受数值,c最小公倍数,d最大公约数
cout<<"请输入两个数值:";
cin>>a>>b;
for(c=(a>b?a:b);c<=a*b;c++)// c=(a>b?a:b) 取ab较大的数字 三目运算符 " ?: "应该知道
if(c%a==0&&c%b==0)
{
break;
}
for(d=(a<b?a:b);d<=a*b;d--)
if(a%d==0&&b%d==0)
{
break;
}
cout<<c<<"\t"<<d<<endl;
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-05
求最大公约数的方法:两个数求最大公约数,可以用辗转相除法。始终用较大数除以较小数,然后用余数代替较大数。整除时的除数就是最大公约数。
#include "stdio.h"
void main()
{
int a,b,num1,num2,temp;
printf("Please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1<num2)
{
temp = num1;
num1 = num2;
num2 = temp;
}
a = num1;
b = num2;
while(b!=0)
{
temp = a%b; //取模,即取余数
a=b;
b=temp;
}
printf("最大公约数为:%d\n",a);
printf("最小公倍数为:%d\n",num1*num2/a);
}
第2个回答  2011-02-26
你的算法本来就是错的,一开始就死循环了,按下面这个,辗转相除法。

#include<iostream>
using namespace std;
int main()
{
int a,b,c=1,d;//a,b接受数值,c最小公倍数,d最大公约数
cout<<"请输入两个数值:";
cin>>a;
cin>>b;
d = a % b;
while(d != 0) {
a = b;
b = d;
d = a % b;
}
d = b;
c = a / d * b;
cout<<"这两个数的最大公约数和最小公倍数分别是:"<<d<<" "<<c<<endl;
return 0;
}
第3个回答  2011-02-26
你这算法是怎么生出来的,莫名其妙。
而且还用double这种数据类型,是int吧

用辗转相除法:
void main()
{
int a,b;
int temp;
int sum=a*b;
scanf("%d%d",&a,&b);
if(a<b)
{
temp=a;
a=b;
b=temp;
}
while((temp=a%b)!=0)//辗转相除,当a能被b整除时的b的值就是最大公约数。
{
a=b;//被除数作为被除数
b=temp;//余数作为除数
}
printf("最大公约数:%d\n",b);
printf("最小公倍数:%d\n",sum/b);
}
第4个回答  2011-02-26
if(a*c!=b*c)
{
c++;
goto asd;
}
这是死循环,如果 输入的 a 和 b 不相等,那么他们乘以一个相同的数也不会相等的。应该改为if ((c%a==0)&&(c%b==0))才对。
另外:不建议用 goto 语句,这是在C++中被弃用的,是一个不好的习惯,因为大程序里 goto 语句太多,会很混乱很难修改。建议你改为 循环实现。
还有一点,你的算法效率也不高啊。

c++编写一个求两个整数最大公约数和最小公倍数的函数
include<math.h> int fun_gy(int,int); \/\/声明最大公约数函数 int fun_gb(int,int); \/\/声明最小公倍数函数 main(){ int a,b,gy,gb;printf("输入两个整数:\\n");scanf("%d%d",&a,&b);gy=fun_gy(a,b); \/\/调用最大公约数函数 gb=fun_gb(a,b); \/\/调用最小公倍数...

用c++编程:求两个正整数的最大公约数和最小公倍数
思路:先求最大公约数,再让两个数相乘,再除最大公约数即可。include<stdio.h> int main(){ int a,b,c,d,m,n,i;scanf("%d %d",&m,&n); (输入两个数)for(i=m;i>=1;i--){a=m%i;b=n%i; (令m,n同时除以一个比他们小的数)if(a==0&&b==0) (当m,n除以i都...

C++求两个数的最大公约数和最小公倍数,不是用辗转相除法。
逻辑值一般不写成==0这种形式,一是易出错(就像你忘了一个等号一样),二是太啰嗦。这里是一种规范的写法,只要这两个里有一个不为0...{k--;}printf("m,n的最大公约数为%d\\n",k);}

C++求两个数的最大公约数和最小公倍数,不是用辗转相除法。
k=MIN(n,m);while(n%k || m%k) \/\/0表示假,其他值表示真。逻辑值一般不写成==0这种形式,一是易出错(就像你忘了一个等号一样),二是太啰嗦。这里是一种规范的写法,只要这两个里有一个不为0...{ k--;} printf("m,n的最大公约数为%d\\n",k);} ...

C++中关于求两个数的最大公约数与最小公倍数
cout<<"这两个数的最大公约数是"<<m<<"\\n这两个数的最小公倍数是"<<n<<endl;} int f(int p,int q){ int r;p>q?r=q:r=p; \/\/找两个数中最小的最小的 for(;p%r!=0||q%r!=0;r--);return r;} int g(int u,int v,int w) \/\/w是最大公约数 { int g;g...

C++编写程序。输入两个正整数,求它们的最大公约数和最小公倍数。
include<iostream.h> include<math.h> void main(){int a,num1,num2,temp;cout<<"please input two numbers:");cin>>num1>>num2;int ji = num1*num2;if(num1<num2) \/*保证第一数是较大的值*\/ {temp=num1;num1=num2;num2=temp;} ...

如何在C++中实现求两个整数的最大公约数和最小公倍数
int 最大公约数(int x,int y){ if(x<=0||y<=0)return 1; if(x==y)return x; if(x<y)swap(x,y); while(true){ x=x%y; if(x==0)return y; swap(x,y); }}int 最小公倍数(int x,int y){ return x*y\/最大公约数(x,y);} ...

...分别求两个整数的最大公约数和最小公倍数,并在main()函数中任意...
int M=1;M<=x;M++) { if(x%M==0 && y%M==0) { n=M; } } }else{ for(int N=1;N<=y;N++) { if(x%N==0 && y%N==0) { n=N; } } }cout<<"最大公约数为:"<<n<<endl;}void f2(int x,int y){ int z;if(x<y)...

...程序定义两函数求两整数的最大公约数和最小公倍数
argc,char *argv[]){int x,y;cout << "Please enter x & y(int 0<x,y)...\\n";if(!(cin >> x >> y) || x<1 || y<1){cout << "Input error, exit...\\n";return 0;}cout << "The GCD is " << mygcd(x,y) << endl;cout << "The LCM is " << mylcm(...

c++输入两个正整数求它们的最大公约数和最小公倍数。
using namespace std;int getMin(int m,int n)\/\/最小公倍数{ int i,j; i=m; if(n>i) i=n; for(j=i;;j++) { if(j%m==0 && j%n==0) break; } return j;}int getMax(int m,int n)\/\/最大公约数{ int i,j; i=m; if(n...

相似回答
大家正在搜