问题描述
- 求最大公约数的c++源代码,要用我的方法,但是运行不了,请看看我的方法对不,
-
/*第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;
若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。
继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。*/
#include //用更相减损术计算最大公约数#include
using namespace std;int main (void)
{
int a;
int b;
int max;
int n=1;printf("a=");
scanf ("%d",&a);
printf("b=");
scanf ("%d",&b);
for( n=2;a%2==0 && b%2==0;n+=2)
{a=a/2; b=b/2;
}
if (a<b)
{
max=b;
b=a;
a=max;}
while(a!=b)
{
int c;
c=a-b;a=b; b=c;
}
printf ("最大公约数=%d",a*n);return 0;
}
解决方案
int main (void)
{
int a;
int b;
int max;
int n=1;
printf("a=");
scanf ("%d",&a);
printf("b=");
scanf ("%d",&b);
for(;a%2==0 && b%2==0;n*=2)//这里n是前面2的乘机,不是2的和
{
a=a/2;
b=b/2;
}
if (a<b)
{
max=b;
b=a;
a=max;
}
while(a!=b)
{
int c;
c=a-b;
if(b>c){//需要判断B和C的大小再做减法
a=b;
b=c;
}else{
a=c;
}
}
printf ("最大公约数=%d",a*n);
return 0;
}
解决方案二:
1.for( n=2;a%2==0 && b%2==0;n+=2),一开始就赋了n=2,如果两都是奇数,到最后还得乘个2,不对,这里不应赋值2
2.for( n=2;a%2==0 && b%2==0;n+=2),n每次变化是乘以2,不是加上2
3.while(a!=b){int c; c=a-b; a=b; b=c;}本来就是令a>b,c=a-b才能大于0,若a=5,b=2,c=a-b=3,则不能把b赋给a,c赋给b,而要判断c,b谁大谁小
解决方案三:
int main (void)
{
int a;
int b;
int max;
int n=1;
printf("a=");
scanf ("%d",&a);
printf("b=");
scanf ("%d",&b);
for(;a%2==0 && b%2==0;n*=2)//这里n是前面2的乘机,不是2的和
{
a=a/2;
b=b/2;
}
if (a<b)
{
max=b;
b=a;
a=max;
}
while(a!=b)
{
int c;
c=a-b;
if(b>c){//需要判断B和C的大小再做减法
a=b;
b=c;
}else{
a=c;
}
}
printf ("最大公约数=%d",a*n);
return 0;
}